首页 > 解决方案 > 如何按 XML 列分组

问题描述

第一次在这里发帖,嗨!

我在我的 SQL 中使用了一些 XML 来拆分字符串,这很好用。

添加计算后尝试 GROUP BY 时,我收到以下错误消息:-“列 'mn' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。”

我的代码片段是:- TA.COST / COUNT(DISTINCT(WO.FIELD1))

LTRIM(RTRIM(mnvalue('.[1]','varchar(8000)')))

CAST('' + REPLACE( (当 WO.FIELD1 为 NULL THEN 'UK' ELSE WO.FIELD1 END),';','') + '' AS XML) AS x

交叉应用 x.nodes('/XMLRoot/RowData')m(n)

我尝试了“n”和“mn”,但收到以下消息:-“从 nodes() 方法返回的列 'n' 不能直接使用。它只能与四种 XML 数据类型之一一起使用方法、exist()、nodes()、query() 和 value(),或者在 IS NULL 和 IS NOT NULL 检查中。"

我也在这里研究过,并尝试在 select 和 GROUP BY 中使用 CONVERT(VARCHAR(MAX).....,但无济于事。

我得到的错误是:“在 GROUP BY 子句中不允许使用 XML 方法”

如果需要,我可以发布代码,但我想我会先说出来。

非常感谢和问候,莱克斯。

标签: xml

解决方案


好的,所以这按设计工作:-

SELECT  WO.FIELD1, TA.FIELD2, 
CONVERT(VARCHAR(MAX), LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))))  AS COUNTRY
FROM
(
SELECT 
WO.FIELD1,
CAST('<XMLRoot><RowData>' + REPLACE(WO.FIELD2,';','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM TABLE1 WO
) WO

LEFT JOIN TABLE2 TA ON WO.FIELD1 = TA.FIELD1
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)

但是,当我在选择中添加计算时,这是它在 GROUP BY 中失败的地方:-

SELECT  WO.FIELD1, TA.FIELD2 / COUNT(DISTINCT(WO.FIELD2)) AS "AVERAGE TIME", 
CONVERT(VARCHAR(MAX), LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))))  AS COUNTRY
FROM
(
SELECT WO.FIELD1,
CAST('<XMLRoot><RowData>' + REPLACE(WO.FIELD2,';','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
FROM TABLE1 WO
) WO
LEFT JOIN TABLE2 TA ON WO.FIELD1 = TA.FIELD1
CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)

GROUP BY
WO.FIELD1, 
TA.FIELD2, 
WO.FIELD2,
???????

非常感谢!:)


推荐阅读