【问题标题】:How to GROUP BY XML column如何按 XML 列分组
【发布时间】:2018-07-18 13:07:12
【问题描述】:

第一次在这里发帖,嗨!

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

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

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

LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)')))

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

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

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

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

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

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

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

【问题讨论】:

  • 能否编辑问题以包含完整的 SQL 语句?我认为我们需要看到整个事情,包括 group by 子句。更好的是,如果您可以将查询简化到显示问题的最低限度,那就太好了。

标签: xml


【解决方案1】:

好的,这样就可以正常工作了:-

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,
???????

非常感谢! :)

【讨论】:

    猜你喜欢
    • 2015-06-25
    • 2018-12-08
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    相关资源
    最近更新 更多