Конкатенация строковых результатов из SQL DENSE_Rank

У меня есть ситуация, когда мне нужно "объединить" результаты SQL из функции DENSE_RANK в одну строку, я не знаю другой функции 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

Я хочу добиться результата, который выглядит следующим образом, поэтому, поскольку у идентификатора 1 было 2 информации одного ранга, я хочу "объединить" их в одну строку (через запятую):

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

В настоящее время у меня есть следующий код, который дает мне результаты из DENSE_RANK, но я застрял, пытаясь выяснить, как получить мой окончательный набор результатов, где у меня есть "сцепленная" строка, я попробовал несколько различных методов и имел хороший взгляд на stackru, но я не могу найти способ, который заставит его работать.

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

2 ответа

Решение

Это тот, который вы ищете?

Использовать CTE or temporary table чтобы сохранить ваш текущий результат, скажем, что это 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 с таким же рангом

@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
Другие вопросы по тегам