xml - 如何按 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 方法”
如果需要,我可以发布代码,但我想我会先说出来。
非常感谢和问候,莱克斯。
解决方案
好的,所以这按设计工作:-
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,
???????
非常感谢!:)
推荐阅读
- java - 忽略 @EqualsAndHashCode 中的 HashCode - Lombok
- c# - PostMessage,如何发送CTRL BUTTON?
- jquery - .net core 2.2 上带有 antiforgerytoken 的 ajax Post 请求
- php - 如何使用视图中的参数调用控制器中的函数?
- javascript - 使用 React 检测垂直页面溢出
- node.js - 使用 nodejs 加密模块解密的问题
- c - c 中的 %(modulus) 运算符如何工作?
- python-2.7 - 如何使用python和beam coGroupby概念连接两个bigquery表而不直接在查询中传递连接条件?
- ethereum - 使用 truffle-hd-wallet 部署 Ropsten 的默认帐户
- swift - 将类型从类型数组传递给泛型方法