2014-12-01 4 views
1

У меня есть небольшая проблема с получением количества чего-то и значения родительского узла для него. На самом деле XML-схема выглядит следующим образом:XQuery - count + значение узла

<car> <carID> 1 </car> <fixes> <fix> <fixID> 1 </fixID> </fix> <fix> <fixID> 2 </fixID> </fix> </fixes> </car>

также более или менее ... что им пытаются достичь, это: с помощью XQuery (и то важную часть) я должен вернуться, сколько фиксирует каждый автомобиль имеет (я знаю, что на примере есть только один автомобиль). Поэтому мне нужно в результате что-то вроде 1 2 или что-то в этом роде. Любая помощь будет принята с благодарностью

Edit: <car> <carID> 1 </car> <departmentID> 1 </departmentID> <fixes> <fix> <fixID> 1 </fixID> </fix> <fix> <fixID> 2 </fixID> </fix> </fixes> </car>

Теперь идентификатор как-то немного более хлопотно;/У меня есть XMLcolumn в SQL-сервер, который проведет sqldocument для автомобиля в отдельных строках, поэтому один ряд один. То, что я пытаюсь сделать дальше, - это получить carID для каждого отдела, у которого больше всего исправлений. ? Любой ключ;/

+0

Wouldnt каждому 'fix' назначить' fixid'? (так что в вашем примере два 'fix'?) – paqogomez

+0

Вы действительно правы, это моя ошибка – user3494351

ответ

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

Редактировать
Update для параметров порядка новый вопрос.

Чтобы применить xml-скребок к столбцу для всех строк таблицы, вам необходимо использовать CROSS APPLY. После того, как вы знаете, как проецировать данные из 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

Это действительно очень помогает. Но теперь у меня есть немного другая проблема. У меня есть экземпляры XML в SQL Server. Если возможно, нажмите «Изменить» в главном сообщении. Спасибо, в любом случае! – user3494351

+0

Я обновил, выше. В следующий раз, пожалуйста, задайте новый вопрос (вы охватите более широкую аудиторию и, скорее всего, получите более быстрое разрешение). – StuartLC

+0

Это выглядит как SQL с некоторыми встроенными выражениями Xpath. Зачем отмечать его xquery? –

Смежные вопросы