我在获取某些东西的计数和父节点的值时遇到了一个小问题。实际上 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服务器中有XML列,它将汽车的sqldocument保存在单独的行中,所以一行一.我试图进一步做的是为每个部门获取大多数修复程序的carID。有什么线索吗?;/
修复结束</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);
SqlFiddle 示例在这里
编辑
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
在这里更新了 SqlFiddle