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
補足として:これをさらに減らす方法はありますか?