2013-08-01 3 views
1

DENSE_RANK 함수의 SQL 결과를 단일 문자열로 "연결"해야하는 상황이 있는데,이 작업을 수행하는 다른 SQL 함수를 인식하지 못합니다.SQL에서 문자열 결과 연결 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 

는 내가 달성하고자하는 결과이다 :

문제는 예를 들어, 그래서 내가 예상 할 수 DENSE_RANK 함수에서 같은 순위에 대한 여러 행으로 끝날 것입니다 즉 ID 1 내가 단일 문자열로 "를 연결할"할 같은 순위로이 정보의 있었기 때문에, 그래서 다음과 같습니다 (쉼표로 구분) :

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는이 쿼리 데 당신에게 Info3의 쉼표로 구분 된 값을 제공 내가 수정 한

+0

감사합니다, 나는 그것을 그러나 시도 준 나는 결국 예를 들어, Info1에 대한 결과로 다음과 같습니다. A, B, A, B, A, B, D, D, F –

+0

위의 대답을 참조하십시오. STUFF 쿼리에 DISTINCT를 추가하여 얻었습니다. 감사. –

+0

당신은 환영합니다 :) – Nithesh

0

@Nithesh

같은 순위 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 

라고 당신의 curent 결과를 저장하기 내 코드도 순위에 끌어 오기 :

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

STUFF 쿼리에 DISTINCT를 추가했습니다. 감사. –