有網友問「多个数据行,其中某一列的数据能否作为一列显示?」,如下圖,
後來找到了「Combine Multiple Rows into One Row using SQL Server」,提供2種做法,覺得第2種很牛,所以註記一下,也跟大家分享。
資料準備
--建立table變數
DECLARE @T1 AS TABLE (
busid NVARCHAR(20)
, drivername NVARCHAR(20)
, insurlistnum NVARCHAR(10)
, insurchildname NVARCHAR(10)
);
--新增資料
INSERT INTO @T1
( busid ,
drivername ,
insurlistnum ,
insurchildname
)
VALUES ( N'吉A30241' ,
N'高 明' ,
N'PICC12345' ,
N'死亡伤残赔偿'
)
,
( N'吉A30241' ,
N'高 明' ,
N'PICC12345' ,
N'医疗费用赔偿'
)
,( N'吉A30241' ,
N'高 明' ,
N'PICC12345' ,
N'财产损失赔偿'
);
--撈出資料
SELECT * FROM @T1;
做法1,用變數及COALESCE來串接
DECLARE @str NVARCHAR(MAX)
SELECT @str = COALESCE(@str + ', ', '') + [insurchildname]
FROM @T1;
SELECT DISTINCT busid ,
drivername ,
insurlistnum ,
@str AS [险种] FROM @T1;
做法2,透過FOR XML及STUFF
SELECT DISTINCT busid ,
drivername ,
insurlistnum ,
STUFF( (SELECT ', ' + insurchildname from @T1 FOR XML PATH('')), 1, 1, '')
AS [险种] FROM @T1;
另外,後來網友有反應說如果條件不同時,要如何處理呢?
就在FOR XML那行再加上WHERE條件就可以了哦!
如下,我在資料中再加入一個 吉A99988 這個人的資料,
--不同人
DECLARE @T1 AS TABLE
(
busid NVARCHAR(20) ,
drivername NVARCHAR(20) ,
insurlistnum NVARCHAR(10) ,
insurchildname NVARCHAR(10)
) ;
INSERT INTO @T1
( busid, drivername, insurlistnum, insurchildname )
VALUES ( N'吉A30241', N'高 明', N'PICC12345', N'死亡伤残赔偿' )
,
( N'吉A30241', N'高 明', N'PICC12345', N'医疗费用赔偿' )
,
( N'吉A30241', N'高 明', N'PICC12345', N'财产损失赔偿' )
,
( N'吉A99988', N'高99988', N'PICC99988', N'财产损失赔偿' )
,
( N'吉A99988', N'高99988', N'PICC99988', N'医疗费用赔偿' ) ;
SELECT ', ' + insurchildname
FROM @T1
WHERE busid = N'吉A99988'
FOR XML PATH('') ;
SELECT DISTINCT
A.busid ,
A.drivername ,
A.insurlistnum ,
STUFF(( SELECT ', ' + insurchildname
FROM @T1 B
WHERE A.busid = B.busid
FOR
XML PATH('')
), 1, 1, '') AS [险种]
FROM @T1 A ;
環境: SQL 2008
參考資料:Combine Multiple Rows into One Row using SQL Server
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^