sql - 将多行连接成一行

标签 sql sql-server tsql

我刚刚在 SQL Server 上学习 SQL。我需要将多行连接成一列。我已经查找了示例,但没有找到可以满足我需求的示例。

Country     ProjectTA   Complexity TID  Sites   Inits   Name
United States A8022 Obesity Low  4692   69  JT  AD
United States A8022 Obesity Low  4692   69  jpni    CBM Budget
United States A8022 Obesity Low  4692   69  PIHR    AD
United States A8022 Obesity Low  4692   69  jpni    CBM Budget
United States A8022 Obesity Low  4692   69  hale    ePublishing Group
United States S8033 CNS Medium   5423   69  ShyP    CBM Payment
United States S8033 CNS Medium   5423   69  dedu    ePublishing Group
United States S8033 CNS Low  5423   69  AHrp    ePublishing Group

我想按 Name 连接行,并用 ',' 列出 Inits

United States A8022 Obesity Low 4692    69 JT,PIHR  AD
United States A8022 Obesity Low 4692    69 jpni, PIHR   CBM Budget
United States A8022 Obesity Low 4692    69 hale          ePublishing Group
United States S8033 CNS Medium  5423    69 ShyP          CBM Payment
United States S8033 CNS Medium  5423    69 dedu, Ahrp   ePublishing Group

任何帮助将不胜感激。非常感谢。

最佳答案

不幸的是,SQL Server 没有一个简单的函数来生成逗号分隔的列表,你必须实现 FOR XML PATH 来获取列表。

有几种方法可以做到这一点,您可以使用 STUFFFOR XML PATH:

select distinct t1.country,
  t1.ProjectTA, 
  t1.Complexity,
  t1.TID,
  t1.Sites,
  STUFF(
         (SELECT ', ' + t2.Inits
          FROM yt t2
          where t1.Country = t2.Country
            and t1.ProjectTA = t2.ProjectTA
            and t1.TID = t2.TID
            and t1.Sites = t2.Sites
            and t1.name = t2.name
          FOR XML PATH (''))
          , 1, 1, '')  AS inits,
  t1.name
from yt t1;

SQL Fiddle with demo

或者您可以使用 CROSS APPLYFOR XML PATH:

select distinct t1.country,
  t1.ProjectTA, 
  t1.Complexity,
  t1.TID,
  t1.Sites, 
  left(t2.inits, len(t2.inits)-1) inits,
  t1.name
from yt t1
cross apply
(
  select t2.Inits + ', '
  from yt t2
  where t1.Country = t2.Country
    and t1.ProjectTA = t2.ProjectTA
    and t1.TID = t2.TID
    and t1.Sites = t2.Sites
    and t1.name = t2.name
  FOR XML PATH('')
) t2 (inits);

SQL Fiddle with Demo .这些都产生了结果:

|       COUNTRY | PROJECTTA |  COMPLEXITY |  TID | SITES |      INITS |              NAME |
-------------------------------------------------------------------------------------------
| United States |     A8022 | Obesity Low | 4692 |    69 |       hale | ePublishing Group |
| United States |     A8022 | Obesity Low | 4692 |    69 | jpni, jpni |        CBM Budget |
| United States |     A8022 | Obesity Low | 4692 |    69 |   JT, PIHR |                AD |
| United States |     S8033 |     CNS Low | 5423 |    69 | dedu, AHrp | ePublishing Group |
| United States |     S8033 |  CNS Medium | 5423 |    69 | dedu, AHrp | ePublishing Group |
| United States |     S8033 |  CNS Medium | 5423 |    69 |       ShyP |       CBM Payment |

关于sql - 将多行连接成一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288501/

相关文章:

sql - INT 数据库字段如何与 VARCHAR 类型进行比较

sql - APEX 根据列比较突出显示行

mysql - 选择按关键字分组的行,但对每组加权而不是使用 COUNT()

sql - 获取从开始到结束日期范围(包括边界)之间的事件行

sql - 查找数据中缺失的日期

c# - Entity Framework 无效对象名称错误

xml - 对于 XML 路径和 xsi :nil attributes

c# - 如何防止用户生成的 SQL 查询中的 SQL 注入(inject)

c# - 如何将 asp.net web 应用程序连接到 kannel 短信网关?

sql-server - 审计触发器中的当前事务 ID