2014-12-01 85 views
1

我有一個小問題,獲取它的父節點的數量和值。 其實XML架構看起來像這樣:XQuery - 節點的數量+值

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

現在ID喜歡的東西多一點麻煩; /我有XMLcolumn其中持有sqldocument汽車在一個單獨的行的SQL Server,所以一成一行。我試圖做的更進一步的是爲每個部門獲得最多修復程序的carID。 ?任何線索;/

+0

難道不每個'fix'有' fixid'? (所以在你的例子中有兩個'fix') – paqogomez 2014-12-01 20:41:20

+0

你確實是對的,那是我的錯誤 – user3494351 2014-12-02 10:49:06

回答

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 scraping應用於表中所有行的列。一旦你知道如何對項目數據進行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

+0

這確實很有用。但是現在我有一點不同的問題。我在SQL Server中有XML實例。如果可能,請檢查主文章中的修改。不管怎麼說,還是要謝謝你! – user3494351 2014-12-02 10:53:33

+0

我已更新,上面。下一次,請提出一個新問題(您將覆蓋更廣泛的受衆羣體,並可能是更快的解決方案)。 – StuartLC 2014-12-02 12:24:11

+0

這看起來像帶有一些嵌入式Xpath表達式的SQL。爲什麼要爲它標記xquery? – 2015-11-24 21:21:45