XQuery - count +节点的值

时间:2014-12-01 20:35:08

标签: sql sql-server count 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 server中有XMLcolumn,它在一个单独的行中保存sqldocument,因此只有一行。我试图进一步做的是为每个部门获得最大量修复的carID。任何线索?; /

1 个答案:

答案 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);

SqlFiddle example here

修改
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

Updated SqlFiddle here