将多行组合成一行,不同的表

时间:2014-01-25 04:17:28

标签: sql sql-server sql-server-2008-r2

我的表格如下:

购物台:

ShopID | PersonID
-----------------
  1    |  10001
  2    |  10002
  2    |  10003

人员表

PersonID | PersonName
---------------------
  10001  | Alex
  10002  | John
  10003  | William

之后,我想通过ShopID分组。我的预期结果如下:

ShopID | PersonName
--------------------
  1    |    Alex
  2    | John / William

我试着参考:Combine multiple rows into one row。和http://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/。但它不是我想要的。

如何将多行合并到另一个表中的一行?

1 个答案:

答案 0 :(得分:1)

查看for xml选项以连接结果。 stuff函数用于删除正斜杠的第一个实例,xml.value函数用于保持&, <, >和其他特殊字符不被XML结尾&amp; &gt; &lt;,等

我的原始答案查询中有一个错误,这是编辑后的版本:

Select s.shopid, 
Stuff (
(
    select ' / '  + p.personName 
    from person p 
    inner join shop s2 on s2.personID = p.personID
    where s2.shopID = s.shopID
    For xml path(''), TYPE --for xml to place everything under node '', which will concatenate the results.
) 
.value('.','NVARCHAR(MAX)') --this is used to convert the XML to nvarchar(max), so that &, <, >, and other special chars do not get XML encoded.
, 1,3,'') --use stuff to replace first 3 characters with empty string.
as PersonName
From shop s
Group by s.shopid 
;