0

XML 型の列を持つテーブルがあります。この列には、レコード間で異なる可能性のある属性の動的リストが含まれています。

属性ごとにテーブルを個別に調べることなく、これらの属性を GROUP BY COUNT しようとしています。

たとえば、1 つのレコードに属性 A、B、C があり、もう 1 つのレコードに 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 をテーブルとして結合できるようなものです。group 句には xml メソッドを含めることができないため、WITH が必要です。

于 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 に答える