2013-08-01 144 views
1

我有一种情况,我需要将来自DENSE_RANK函数的SQL结果“连接”为单个字符串,但我不知道另一个SQL函数会这样做。从SQL连接字符串结果DENSE_Rank

的问题是,我最终从DENSE_RANK功能,可以预期其同级别多行,所以例如:

ID Info Total Rank 
1  A  2  1 
1  B  2  1 
1  C  1  2 
2  D  2  1 
2  E  1  2 
3  F  1  1 

我想实现的是结果看起来像下面,是因为ID 1有2个信息与同级别我想将它们“拼接”成一个字符串(用逗号隔开):

ID Info1 Info2  
1  A,B  C 
2  D  E 
3  F  G 

我目前有以下代码给我从DENSE_RANK的结果,但我试图弄清楚如何让我的最终结果集,我有一个“串联”的字符串,我试过一些不同的技术并通过stackoverflow有一个很好的看,但我不能找到一种方式,将使其工作。

SELECT t1.ID 
    ,t2.Info1 
    ,t3.Info2 
    ,t4.Info3 
FROM table1 t1 WITH (NOLOCK) 
LEFT JOIN (SELECT t2.ID 
      ,t2.Info AS Info1 
      ,t2.Total 
     FROM (SELECT t2.ID 
        ,t2.Info 
        ,t2.Total 
        ,DENSE_RANK() OVER (PARTITION BY t2.ID ORDER BY t2.Total DESC) AS DENSE_RANK 
      FROM table2 t2 WITH (NOLOCK)) t2 
      WHERE DENSE_RANK = 1) AS t2 ON t1.ID = t2.ID 

LEFT JOIN (SELECT t3.ID 
      ,t3.Info AS Info2 
      ,t3.Total 
     FROM (SELECT t3.ID 
        ,t3.Info 
        ,t3.Total 
        ,DENSE_RANK() OVER (PARTITION BY t3.ID ORDER BY t3.Total DESC) AS DENSE_RANK 
      FROM table3 t3 WITH (NOLOCK)) t3 
      WHERE DENSE_RANK = 2) AS t3 ON t1.ID = t3.ID 

LEFT JOIN (SELECT t4.ID 
      ,t4.Info AS Info3 
      ,t4.Total 
     FROM (SELECT t4.ID 
        ,t4.Info 
        ,t4.Total 
        ,DENSE_RANK() OVER (PARTITION BY t4.ID ORDER BY t4.Total DESC) AS DENSE_RANK 
      FROM table4 t4 WITH (NOLOCK)) t4 
      WHERE DENSE_RANK = 3) AS t4 ON t1.ID = t4.ID 

ORDER BY t1.ID ASC 

回答

0

这是你正在寻找的?

使用CTE or temporary table来存储您CURENT结果说,这是temp

SELECT SELECT MAX(t1.ID) 
    ,STUFF((SELECT ','+Info3 FROM temp t 
      WHERE t.Rank=A.RankFOR XML PATH('')) , 1 , 1 , '') 
FROM temp A 
GROUP BY A.Rank 

该查询为您提供的Info3的逗号分隔值具有相同的秩

+0

谢谢,我已经给然而试试看我结束了结果以Info1为例: A,B,A,B,A,B,D,D,F –

+0

请看我的上面的答案,我通过向STUFF查询添加了DISTINCT来得到它。谢谢。 –

+0

欢迎您:) – Nithesh

0

@Nithesh

我修改我的代码也拉入排名:

SELECT t1.ID 
    ,t2.Info1 
    ,t2.DENSE_RANK AS [Rank1] 
    ,t3.Info2 
    ,t3.DENSE_RANK AS [Rank2] 
    ,t4.Info3 
    ,t4.DENSE_RANK AS [Rank3] 
INTO temp 
FROM table1 t1 WITH (NOLOCK) 
LEFT JOIN (SELECT t2.ID 
      ,t2.Info AS Info1 
      ,t2.Total 
      ,t2.DENSE_RANK 
     FROM (SELECT t2.ID 
        ,t2.Info 
        ,t2.Total 
        ,DENSE_RANK() OVER (PARTITION BY t2.ID ORDER BY t2.Total DESC) AS DENSE_RANK 
      FROM table1 t2 WITH (NOLOCK)) t2 
      WHERE DENSE_RANK = 1) AS t2 ON t1.ID = t2.ID 

LEFT JOIN (SELECT t3.ID 
      ,t3.Info AS Info2 
      ,t3.Total 
      ,t3.DENSE_RANK 
     FROM (SELECT t3.ID 
        ,t3.Info 
        ,t3.Total 
        ,DENSE_RANK() OVER (PARTITION BY t3.ID ORDER BY t3.Total DESC) AS DENSE_RANK 
      FROM table1 t3 WITH (NOLOCK)) t3 
      WHERE DENSE_RANK = 2) AS t3 ON t1.ID = t3.ID 

LEFT JOIN (SELECT t4.ID 
      ,t4.Info AS Info3 
      ,t4.Total 
      ,t4.DENSE_RANK 
     FROM (SELECT t4.ID 
        ,t4.Info 
        ,t4.Total 
        ,DENSE_RANK() OVER (PARTITION BY t4.ID ORDER BY t4.Total DESC) AS DENSE_RANK 
      FROM table1 t4 WITH (NOLOCK)) t4 
      WHERE DENSE_RANK = 3) AS t4 ON t1.ID = t4.ID 

ORDER BY t1.ID ASC 

我然后运行代码的修改版本提供的(感谢):

SELECT MAX(A.ID) AS ID 
    ,STUFF((SELECT ',' + Info1 
      FROM temp t WITH (NOLOCK) 
      WHERE t.[Rank1] = A.[Rank1] 
       AND t.[ID] = A.[ID] FOR XML PATH('')) , 1 , 1 , '') AS Info1 
FROM temp A 
GROUP BY A.ID 
    ,A.[Rank1] 

但我的成绩仍然含有重复:

ID Info1 
1 A,A,A,B,B,B 
2 D,D 
3 F 
+0

得到它添加DISTINCT到STUFF查询。谢谢。 –