选择xml列上的元素频率

时间:2014-04-24 09:18:27

标签: sql sql-server xml tsql xquery

在Sql Server中考虑这个表结构:

ID - uniqueidentifier
Params - xml

和以下格式的行:

<!--ROW1 xml column content-->
<Params>
  <Module>
    <ModuleName>Module1</ModuleName>
  </Module>
  <Module>
    <ModuleName>Module2</ModuleName>
  </Module>
</Params>

<!--ROW2 xml column content-->
<Params>
    <Module>
        <ModuleName>Module1</ModuleName>
    </Module>
</Params>

预期输出(表中每个元素出现的总和):

_______________
| Module1 | 2 |
| Module2 | 1 |
|_____________|

每行中Module元素的数量为0..n。我试图创建存储过程,为每个xml字段输入返回多行,然后将每行的结果提供给临时表,但我找不到正确的语法。有人可以参考相关资源或显示一些小片段如何处理它?感谢您提供的任何提示。

2 个答案:

答案 0 :(得分:1)

您可以应用一些xquery来获取模块名称,然后使用GROUP BY计算它们:

SELECT ModuleName, COUNT(*) AS NumOccurrences
FROM
(
   SELECT
     Nodes.node.value('(ModuleName)[1]', 'varchar(50)') AS ModuleName
   FROM
       Modules m
       cross apply m.Params.nodes('//Module') as Nodes(node)
) x
GROUP BY ModuleName;

(不幸的是,我们无法直接对xml进行分组,因此需要派生表)

SqlFiddle here

答案 1 :(得分:1)

除了Stuart的回答,您还可以使用over子句

select distinct 
       t.x.value('.','varchar(50)'), 
       COUNT(*) over (partition by t.x.value('.','varchar(50)'))  
from yourtable 
    cross apply x.nodes('/Params/Module/ModuleName') t(x)