[SQL]將多筆資料中某一欄的資料轉作一列顯示

  • 21456
  • 0
  • SQL
  • 2016-12-15

有網友問「多个数据行,其中某一列的数据能否作为一列显示?」,如下圖,

 

image

後來找到了「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:從零開始的軟體開發生活

請大家繼續支持 ^_^