SQL xml列组和计数元素数据

时间:2011-01-14 15:13:41

标签: sql xml

我需要帮助对SQL Server表中的xml数据类型列中的元素进行分组和计数。列数据如下所示:

<Books count="6">
  <Book id="1">
    <Category>A</Category>
  </Book>
  <Book id="2">
    <Category>B</Category>
  </Book>
  <Book id="3">
    <Category>B</Category>
  </Book>
  <Book id="4">
    <Category>B</Category>
  </Book>
  <Book id="5">
    <Category>C</Category>
  </Book>
  <Book id="6">
    <Category>C</Category>
  </Book>
</Books>

输出如下所示:

Category  Count
A         1
B         3
C         2

我已经弄清楚如何获取每一行的类别,但它们都像这样粘在一起:
ABBBCC

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

DECLARE @Input XML 
SET @Input = '<Books count="6">
  <Book id="1">
    <Category>A</Category>
  </Book>
  <Book id="2">
    <Category>B</Category>
  </Book>
  <Book id="3">
    <Category>B</Category>
  </Book>
  <Book id="4">
    <Category>B</Category>
  </Book>
  <Book id="5">
    <Category>C</Category>
  </Book>
  <Book id="6">
    <Category>C</Category>
  </Book>
</Books>'

;WITH CatValues AS
(
    SELECT
        B.value('(Category)[1]', 'varchar(50)') 'Category'
    FROM
        @Input.nodes('/Books/Book') as B(B)
)
SELECT
    Category, COUNT(*)
FROM
    CatValues
GROUP BY
    Category

由于像B.value('(Category)[1]', 'varchar(50)')这样的XML操作不能直接成为GROUP BY子句的一部分,因此我们的想法是坚持使用代码将XML中的Category抓取到公用表表达式中(CTE)并从中选择和分组。