来自多行的Concat多列

时间:2017-05-15 14:55:32

标签: sql-server sql-server-2008

我们有一个包含以下数据的表

CustomerID 3rdPartyClientID ReasonA      ReasonB   ReasonC
0001       10001            AddressCheck NameCheck Null
0001       10001            NameCheck    TakeOrder Feedback
0001       10002            TakeOrder    Null      Null
0002       10001            TakeOrder    Null      Null
0001       10002            AddressCheck NameCheck Null

部门希望输出为每个客户的一行,如下所示: -

CustomerID Notes
0001       10001 - AddressCheck, NameCheck, TakeOrder, Feedback, 10002 - AddressCheck, NameCheck, TakeOrder
0002       10001 - TakeOrder

当我有多个第三方客户端ID时,我很难在每个客户的“Notes”列中获取数据。任何帮助都会受到极大的欢迎。

2 个答案:

答案 0 :(得分:1)

您可以一起使用CONCAT和GROUP_CONCAT

SELECT
  GROUP_CONCAT(
    CONCAT(`3rdPartyClientID`, ',', `ReasonA`, ',', `ReasonB`)
  )
FROM [table]
GROUP BY `CustomerID`;

注意: NULL值将导致问题。在这种情况下,CONCAT将返回NULL。因此,修复NULL值或在QUERY中创建IF ELSE语句。

答案 1 :(得分:1)

您可以使用以下内容

select CustomerId, stuff((select ','+[3rdPartyClientId]+ ' - ' +coalesce([ReasonA],'')+coalesce([ReasonB],'')+coalesce([ReasonC],'') from yourdatetable i where a.CustomerId = i.amount for xml path('')),1,1, '') 
    from yourtable a
group by CustomerId

如果是SQL Server 2017或vnext,您可以使用String_agg,如下所示:

select CustomerId, string_agg([3rdPartyClientId]+ ' - ' +coalesce([ReasonA],'')+coalesce([ReasonB],'')+coalesce([ReasonC], ',')
    from yourtable a
group by CustomerId