0

我有一个带有 XML 类型列的表。此列包含记录之间可能不同的属性的动态列表。

我正在尝试对这些属性进行 GROUP BY COUNT,而不必为每个属性分别浏览表格。

例如,一条记录可能有属性 A、B 和 C,而另一条记录可能有 B、C、D,然后,当我执行 GROUP BY COUNT 时,我会得到 A = 1、B = 2、C = 2 和 D = 1 .

有没有直接的方法可以做到这一点?

编辑回复安德鲁的回答

因为我对这个结构的了解充其量是肤浅的,所以我不得不摆弄它来让它做我想做的事。在我的实际代码中,我需要按 TimeRange 进行分组,并且只根据它们的名称选择一些属性。我在下面粘贴实际查询:

WITH attributes AS (
  SELECT 
  Timestamp,
  N.a.value('@name[1]', 'nvarchar(max)') AS AttributeName,
  N.a.value('(.)[1]', 'nvarchar(max)') AS AttributeValue  
  FROM MyTable
  CROSS APPLY AttributesXml.nodes('/Attributes/Attribute') AS N(a)
)
SELECT Datepart(dy, Timestamp), AttributeValue, COUNT(AttributeValue)
FROM attributes
WHERE AttributeName IN ('AttributeA', 'AttributeB')
GROUP BY Datepart(dy, Timestamp), AttributeValue

附带说明:有没有办法进一步减少这种情况?

4

2 回答 2

1
WITH attributes AS (
  SELECT a.value('(.)[1]', 'nvarchar(max)') AS attribute
  FROM YourTable
  CROSS APPLY YourXMLColumn.nodes('//path/to/attributes') AS N(a)
)
SELECT attribute, COUNT(attribute)
FROM attributes
GROUP BY attribute

CROSS APPLY 就像能够将 xml 作为表加入。需要 WITH 是因为您不能在 group 子句中包含 xml 方法。

于 2012-04-25T16:35:18.477 回答
0

这是一种将属性数据转换为您可以轻松使用它并减少您需要通过主表的次数的方法。

--create test data
declare @tmp table (
    field1 varchar(20),
    field2 varchar(20),
    field3 varchar(20))

insert into @tmp (field1, field2, field3)
values ('A', 'B', 'C'),
    ('B', 'C', 'D')

--convert the individual fields from seperate columns to one column
declare @table table(
    field varchar(20))

insert into @table (field)
select field1 from @tmp
union all
select field2 from @tmp
union all
select field3 from @tmp

--run the group by and get the count
select field, count(*)
from @table
group by field  
于 2012-04-25T16:27:07.580 回答