首页 > 解决方案 > 有没有办法在 1 行而不是多行中获取我的代码的所有结果?

问题描述

我试图在 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

标签: sqlsql-serversql-server-2012

解决方案


适用于 SQL 服务器 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 返回文本类型数据。


推荐阅读