我有一个小问题,为它获取一些东西和父节点的值。 实际上,xml架构看起来像这样:
<car>
<carID> 1 </car>
<fixes>
<fix>
<fixID> 1 </fixID>
</fix>
<fix>
<fixID> 2 </fixID>
</fix>
</fixes>
</car>
或多或少...我想要实现的是:通过使用XQuery(这是重要的部分)我需要返回每辆车有多少修复(我知道在例子中只有一辆车)。所以我需要结果像1 2或类似的东西。 任何帮助将不胜感激
编辑:
<car>
<carID> 1 </car>
<departmentID> 1 </departmentID>
<fixes>
<fix>
<fixID> 1 </fixID>
</fix>
<fix>
<fixID> 2 </fixID>
</fix>
</fixes>
</car>
现在我喜欢更麻烦的东西; /我在sql server中有XMLcolumn,它在一个单独的行中保存sqldocument,因此只有一行。我试图进一步做的是为每个部门获得最大量修复的carID。任何线索?; /
答案 0 :(得分:2)
修复结束</carID>
标记后,您可以应用xpath count
聚合返回count
修正:
DECLARE @xml XML =
'<car>
<carID> 1 </carID>
<fixes>
<fix>
<fixID> 1 </fixID>
<fixID> 2 </fixID>
</fix>
</fixes>
</car>';
SELECT
Nodes.node.value('(carID)[1]', 'int') AS Car,
Nodes.node.value('count(fixes/fix/fixID)', 'int') AS Fixes
FROM
@xml.nodes('//car') AS Nodes(node);
修改强>
OP的新课题更新。
您需要使用CROSS APPLY
将xml抓取应用于表中所有行的列。一旦你知道如何从Xml列中投射数据,剩下的就变成了使用连续的Sql投影移动到最终结果的简单问题:
WITH cteCarFixes AS
(
SELECT
Nodes.node.value('(carID)[1]', 'int') AS CarId,
Nodes.node.value('(departmentID)[1]', 'int') AS DepartmentId,
Nodes.node.value('count(fixes/fix/fixID)', 'int') AS Fixes
FROM
CarFixes cf
CROSS APPLY cf.SomeXml.nodes('//car') as Nodes(node)
),
cteRankedCarFixes AS
(
SELECT CarId, DepartmentId, Fixes,
ROW_NUMBER() OVER(PARTITION BY DepartmentId ORDER BY Fixes DESC) AS Ranking
FROM
cteCarFixes cf
)
SELECT DepartmentId, CarId, Fixes
FROM
cteRankedCarFixes
WHERE
Ranking = 1