XQuery - 节点的计数 + 值



我在获取某些东西的计数和父节点的值时遇到了一个小问题。实际上 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

最新更新