Конкатенация строковых результатов из 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