将行/记录中的多个数据合并为一行,使用逗号分隔字段

时间:2011-11-23 14:48:56

标签: sql sql-server tsql

如果我要查询我们的ORDERS表,我可以输入以下内容:

 SELECT * FROM ORDERS
 WHERE ITEM_NAME = 'Fancy Pants'

在此查询的结果中,我可能会得到以下内容:

 ----------------------------------------------------------------------
 ORDER_ID       WAIST       First_Name       Email
 ----------------------------------------------------------------------
 001            32          Jason            j-diddy[at]some-thing.com
 005            28          Pip              pirrip[at]british-mail.com
 007            28          HAL9000          olhal[at]hot-mail.com

现在,我也想从另一张表中提取信息:

SELECT * FROM PRODUCTS 在哪里ITEM_NAME ='Fancy Pants'

 ------------------------------------------
 PRODUCT_ID     Product       Prod_Desc
 ------------------------------------------
 008            Fancy Pants   Really fancy.

但是,最后,我实际上想通过SQL查询将这些记录压缩成一行:

 -----------------------------------------------------------------------------
 PRODUCT       ORDER_Merged  First_Name_Merged  Email_Merged
 -----------------------------------------------------------------------------
 Fancy Pants   001,005,007   Jason,Pip,Hal9000  j-di[...].com, pirrip[...].com

无论如何,这就是它的样子。我无法弄清楚的是“合并”查询的样子。

不幸的是,我在这里的搜索引导我获得PHP的结果。我发现了几个结果:merging into CSV rows via SQL但我不认为它们会在我的场景中起作用。

任何见解都将一如既往地受到高度赞赏。

更新:

啊,结果STUFFFOR XML函数为exactly what I needed。谢谢大家!!

 Select
    A.name,
         stuff((
         select ',' + B.address
         from Addresses B
         WHERE A.id=B.name_id
         for xml path('')),1,1,'')
    From Names A

1 个答案:

答案 0 :(得分:1)

这是一篇关于群组连接的各种方法的优秀文章,其中包括各自的赞成和反对意见。

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

然而,就个人而言,我个人喜欢Coalesce的方法:

https://dba.stackexchange.com/a/2615/1607