如何按XML分组

时间:2018-07-18 13:07:12

标签: xml

第一篇文章在这里,您好!

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

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

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

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

CAST(''+ REPLACE( (如果WO.FIELD1为NULL则为'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方法”

如果需要,我可以发布代码,但是我想先听一遍。

在此先多谢与问候, Lex。

1 个答案:

答案 0 :(得分:0)

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

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)

但是,当我在选择中添加calc时,这就是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,
???????

非常感谢! :)