Sql 使用FOR XML路径时遇到问题-没有连接

Sql 使用FOR XML路径时遇到问题-没有连接,sql,xml,sql-server-2016,Sql,Xml,Sql Server 2016,我有一种情况,订单可以包含多个许可证购买-如果订单确实包含多个许可证,我希望在单个单元格中显示许可证说明,其值用逗号分隔。如果我们在SQL 2017上,我可以使用STRING_AGG,但我们在SQL 2016上,所以我正在尝试经过验证的STUFF/FOR XML路径方法 从下面的屏幕截图中,客户4341073在订单ID 18519173上购买了两个许可证: 当我将STUFF/FOR XML路径添加到T-SQL时,我无法实现在同一记录中显示许可证描述的预期结果-每个许可证仍然有自己的行 SELE

我有一种情况,订单可以包含多个许可证购买-如果订单确实包含多个许可证,我希望在单个单元格中显示许可证说明,其值用逗号分隔。如果我们在SQL 2017上,我可以使用STRING_AGG,但我们在SQL 2016上,所以我正在尝试经过验证的STUFF/FOR XML路径方法

从下面的屏幕截图中,客户4341073在订单ID 18519173上购买了两个许可证:

当我将STUFF/FOR XML路径添加到T-SQL时,我无法实现在同一记录中显示许可证描述的预期结果-每个许可证仍然有自己的行

SELECT   x.CustomerID ,
         x.ATOLicenseTypeID ,
         x.ATOLicense ,
         x.AuthorizationBeginDate ,
         x.AuthorizationEndDate ,
         x.OrderID ,
         x.OrderDate ,
         STUFF ( (
                 SELECT ',' + lt.description
                 FROM   dbo.LicenseTypes AS lt
                 --INNER JOIN #XMLPATH ON lt.id = x.OrderLicenseTypeID
                 WHERE  lt.id = x.OrderLicenseTypeID
                 --GROUP BY ',' + lt.description
                 FOR XML PATH ( '' )
             ) , 1 , 1 , '' ) AS Licenses
FROM     #XMLPATH AS x
--GROUP BY x.CustomerID ,
--         x.ATOLicenseTypeID ,
--         x.ATOLicense ,
--         x.AuthorizationBeginDate ,
--         x.AuthorizationEndDate ,
--         x.OrderID ,
--         x.OrderDate ,
--         x.OrderLicenseTypeID;

我尝试了不同的方法将子查询连接到外部查询,并添加和删除了GROUP BY以获得所需的结果,但没有任何效果

关于我在这个问题上的错误有什么建议吗

样本数据集:

DROP TABLE IF EXISTS #XMLPATH;

CREATE TABLE #XMLPATH
    (
        CustomerID INT ,
        ATOLicenseTypeID INT ,
        ATOLicense VARCHAR (500) ,
        AuthorizationBeginDate DATE ,
        AuthorizationEndDate DATE ,
        OrderID INT ,
        OrderDate DATETIME ,
        OrderLicenseTypeID INT
    );
INSERT INTO #XMLPATH
VALUES ( 4341073, 52, 'Temporary Resident Fishing', N'2019-01-07T00:00:00', N'2019-01-07T00:00:00', 18519136, N'2019-01-07T12:01:55.317', 2141 ) ,
       ( 4341073, 52, 'Temporary Resident Fishing', N'2019-01-07T00:00:00', N'2019-01-07T00:00:00', 18519173, N'2019-01-07T12:34:13.107', 204 ) ,
       ( 4341073, 52, 'Temporary Resident Fishing', N'2019-01-07T00:00:00', N'2019-01-07T00:00:00', 18519173, N'2019-01-07T12:34:13.107', 2141 );

SELECT * FROM #XMLPATH;

SELECT   x.CustomerID ,
         x.ATOLicenseTypeID ,
         x.ATOLicense ,
         x.AuthorizationBeginDate ,
         x.AuthorizationEndDate ,
         x.OrderID ,
         x.OrderDate ,
         STUFF ( (
                 SELECT ',' + lt.description
                 FROM   dbo.LicenseTypes AS lt
                 --INNER JOIN #XMLPATH ON lt.id = x.OrderLicenseTypeID
                 WHERE  lt.id = x.OrderLicenseTypeID
                 --GROUP BY ',' + lt.description
                 FOR XML PATH ( '' )
             ) , 1 , 1 , '' ) AS Licenses
FROM     #XMLPATH AS x
GROUP BY x.CustomerID ,
         x.ATOLicenseTypeID ,
         x.ATOLicense ,
         x.AuthorizationBeginDate ,
         x.AuthorizationEndDate ,
         x.OrderID ,
         x.OrderDate ,
         x.OrderLicenseTypeID;

为了将一个
OrderID
的所有行作为一个结果行,您不得将分隔信息(OrderLicenseTypeID)包含在
分组中。但是您遇到了一个问题:您不能在
FOR XML
构造中使用此ID

诀窍是(正如您的out commented试用版所示),将源表添加到子选择中,并在其中使用分组列进行筛选。但是,您必须使用不同的别名将它们作为两个不同的集合来处理。试试这个:

(我不得不再添加一个临时表来测试这个…)


顺便说一句:从v2017开始就有,这使得这更容易…

谢谢!我一回到工作岗位就去检查一下。经过一些细微的修改后,效果不错。谢谢你的帮助。
SELECT   x.CustomerID ,
         x.ATOLicenseTypeID ,
         x.ATOLicense ,
         x.AuthorizationBeginDate ,
         x.AuthorizationEndDate ,
         x.OrderID ,
         x.OrderDate ,
         STUFF ( (
                 SELECT ',' + lt.description
                 FROM   #XMLPATH x2 
                 INNER JOIN #LicenseTypes AS lt ON lt.id=x2.OrderLicenseTypeID
                 WHERE  x2.OrderID = x.OrderID --you might need to add more columns here....
                 --in most cases we want to add an ORDER BY
                 FOR XML PATH ( '' )
             ) , 1 , 1 , '' ) AS Licenses
FROM     #XMLPATH AS x
GROUP BY x.CustomerID ,
         x.ATOLicenseTypeID ,
         x.ATOLicense ,
         x.AuthorizationBeginDate ,
         x.AuthorizationEndDate ,
         x.OrderID ,
         x.OrderDate;