2017-09-06 61 views
0

このクエリを使用してサブ要素の数を正常に取得しました。SQL Server:XML要素の要素名によるカウント

SELECT 
    raa.ApplicationXML.value('count(Root/ThirdParty/*)', 'Int') as [Bureau Count] 
FROM 
    Table1 raa 

ただし、このカウントをサブ要素の実際の名前でグループ化するとします。

レコード1:

<Root> 
    <ThirdParty> 
     <BureauRed /> 
     <BureauGreen /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root> 

レコード2:

<Root> 
    <ThirdParty> 
     <BureauRed /> 
     <BureauPurple /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root> 

レコード3:

私のXMLは次のようなものになります

<Root> 
    <ThirdParty> 
     <BureauGreen /> 
     <BureauRed /> 
     <BureauPurple /> 
     <BureauOrange /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root> 

をだけでなく、私は必要ですかそれぞれの数を引き出す

SELECT 
    raa.ApplicationXML.value('count(Root/ThirdParty/*)', 'Int') as [Bureau Count] 
FROM 
    Table1 raa 
GROUP BY 
    raa.ApplicationXML.value('count(Root/ThirdParty/*)', 'Int') 
:このクエリを使用して

XML methods are not allowed in a GROUP BY clause.

:事務局は、私は、私は、カウントして、グループにしようとすると、私はエラーを取得ビューロー(などBureauRed、BureauGreen、BureauBlue、)の名前を取得する必要があります

局の数と名前を取得するにはどうすればよいですか?私はこの結果を探しています

Bureau   Count 
============ ===== 
BureauRed  3 
BureauGreen 2 
BureauBlue  3 
BureauPurple 2 
BureauOrange 1 
+0

は、これらの3つのレコード –

+0

の予想結果を提供することは私たちに満たされた一時テーブルなどのサンプルデータを与える方が良いでしょう –

+0

私はストーリーを更新しました。申し訳ありませんが、数字は並んでいませんでした。 – user3179585

答えて

0

あなたは、XQueryを介してデータが供給した後のグループができます。

DECLARE @xml1 xml = 
'<Root> 
    <ThirdParty> 
     <BureauRed /> 
     <BureauGreen /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root>'; 
DECLARE @xml2 xml = 
'<Root> 
    <ThirdParty> 
     <BureauRed /> 
     <BureauPurple /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root>'; 
DECLARE @xml3 xml = 
'<Root> 
    <ThirdParty> 
     <BureauGreen /> 
     <BureauRed /> 
     <BureauPurple /> 
     <BureauOrange /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root>'; 

DECLARE @temp TABLE (XmlData xml); 

INSERT @temp VALUES (@xml1), (@xml2), (@xml3); 

WITH cte AS 
(
    SELECT n.value('local-name(.)', 'varchar(50)') nodeName 
     FROM @temp t 
     CROSS APPLY t.XmlData.nodes('/Root/ThirdParty/*') x(n) 
) 
SELECT nodeName, count(*) cnt 
    FROM cte 
    GROUP BY nodeName; 

出力:

nodeName           cnt 
-------------------------------------------------- ----------- 
BureauBlue           3 
BureauGreen          2 
BureauOrange          1 
BureauPurple          2 
BureauRed           3 
0

あなたはRoot/ThirdParty最初の子である要素を抽出して集計を行うためにその派生テーブルを使用する必要があります。

DECLARE @tv TABLE(x XML); 

INSERT INTO @tv(x)VALUES(
N'<Root> 
    <ThirdParty> 
     <BureauRed /> 
     <BureauGreen /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root>'),(
N'<Root> 
    <ThirdParty> 
     <BureauRed /> 
     <BureauPurple /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root>'),(
N'<Root> 
    <ThirdParty> 
     <BureauGreen /> 
     <BureauRed /> 
     <BureauPurple /> 
     <BureauOrange /> 
     <BureauBlue /> 
    </ThirdParty> 
</Root>'); 

WITH bureaus AS (
    SELECT 
     bureau=n.v.value('local-name(.)','NVARCHAR(256)') 
    FROM 
     @tv 
     CROSS APPLY x.nodes('/Root/ThirdParty/*') AS n(v) 
) 
SELECT 
    bureau, 
    [count]=COUNT(*) 
FROM 
    bureaus 
GROUP BY 
    bureau 
ORDER BY 
    bureau; 
関連する問題