问题描述
|
我需要在表上编写一个SQL查询,以便结果将具有按列分组以及带有逗号分隔符的聚合列。
我的表格将采用以下格式
|`````````|````````|
| ID | Value |
|_________|________|
| 1 | a |
|_________|________|
| 1 | b |
|_________|________|
| 2 | c |
|_________|________|
预期结果应采用以下格式
|`````````|````````|
| ID | Value |
|_________|________|
| 1 | a,b |
|_________|________|
| 2 | c |
|_________|________|
解决方法
您想使用
FOR XML PATH
构造:
select
ID,stuff((select \',\' + Value
from YourTable t2 where t1.ID = t2.ID
for xml path(\'\')),1,2,\'\') [Values]
from YourTable t1
group by ID
STUFF
功能是摆脱开头的\',\'
。
您还可以在此处查看其他示例:
两个表之间的SQL相同单位需要1个单元格中的订单号
SQL和Coldfusion左连接表在一列中以列表形式获取重复结果
, 仅出于平衡的观点,您也可以使用CTE进行此操作,但是它不如我认为的交叉应用方法好。我已经对蹄的编码进行了编码,如果无法使用,请您道歉。
WITH CommaDelimitedCTE (RowNumber,ID,[Value],[Values]) AS
(
SELECT 1,MT.ID,MIN(MT.Value),CAST(MIN(MT.Value) AS VARCHAR(8000))
FROM MyTable MT
GROUP BY MT.ID
UNION ALL
SELECT CT.RowNumber + 1,MT.Value,CT.[Values] + \',\' + MT.Value
FROM MyTable MT
INNER JOIN CommaDelimitedCTE CT ON CT.ID = MT.ID
WHERE MT.[Value] > CT.[Value]
)
Select CommaDelimitedCTE.* from CommaDelimitedCTE
INNER JOIN (SELECT MT.ID,MAX(RowNumber) as MaxRowNumber from CommaDelimitedCTE GROUP BY MT.ID) Q on Q.MT.ID = CommaDelimitedCTE.MT.ID
AND Q.MaxRowNumber = CommaDelimitedCTE.RowNumber