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