有没有一种方法可以将代码中的所有结果都排成一行而不是多行?

时间:2019-05-03 21:27:12

标签: sql sql-server sql-server-2012

我试图在1行而不是多行上获得结果。

我是SQL的新手,不确定要做什么。

SELECT
  I.D1NAME,
  S.MEMBER_NBR,
  s.SHARE_NBR
FROM ID.MonthEnd_DL_Load_Dates EOM
JOIN SHARE S ON
  EOM.month_end_date = S.DL_LOAD_DATE AND
  COALESCE(S.CLOSED,0) = 0 AND
  DATEDIFF(DAY,S.LAST_CUST_CONT_DATE,MONTH_END_DATE) > 365
JOIN MEMBERSHIPPARTICIPANT MP ON
  S.DL_LOAD_DATE = MP.DL_LOAD_DATE AND
  S.MEMBER_NBR = MP.MEMBER_NBR
JOIN INDIVIDUAL I ON
  MP.DL_LOAD_DATE = I.DL_LOAD_DATE AND
  MP.INDIVIDUAL_ID = I.INDIVIDUAL_ID
WHERE EOM.sequence = 1

我得到:

Rob 1234 1
Rob 1234 2

我想得到:

Rob 1234 1,2

1 个答案:

答案 0 :(得分:0)

对于SQL SERVER 2008-2016

此变通办法使用XML PATH和STUFF来将单个变量的多行聚合为一行连接值。此解决方案模仿SQL SERVER 2017中的STRING_AGG。

我将演示使用AdventureWorks数据库和以下查询:

SELECT SOH.SalesOrderID
      ,STUFF
        (
            (
                SELECT ', ' + CAST(SOD.ProductID AS VARCHAR(20)) AS [text()]
                FROM AdventureWorks2016.Sales.SalesOrderDetail AS SOD
                WHERE SOH.SalesOrderID = SOD.SalesOrderID
                ORDER BY SOD.SalesOrderDetailID
                FOR XML PATH('')
            ), 1, 1, NULL
        ) AS ProductIDs
 FROM AdventureWorks2016.Sales.SalesOrderHeader AS SOH

示例输出:

SalesOrderID    ProductIDs
51176    796, 872
51177    970, 708
51178    779, 871, 870
51179    795, 933, 922, 879
51180    793, 872, 870, 707, 714
51181    792, 922, 933, 707

XML PATH通过将值作为文本节点返回来将串联在一起。 STUFF消除了逗号开头。 SELECT语句将收集的文本节点连接在一起,并使用以下行来分隔结果:

SELECT ', ' + CAST(SOD.ProductID AS VARCHAR(20)) AS [text()]

PITFALL: 请确保将SHARE_NBR转换为VARCHAR(或NVARCHAR),因为XML PATH返回文本类型数据,因此它不适用于数字数据类型。