我有一个带有XML类型列的表。该列包含可能在记录之间不同的属性的动态列表。通过动态列表的T-SQL GROUP BY
我想通过这些属性GROUP BY COUNT,而不必单独通过每个属性的表。
例如,一条记录可能具有属性A,B和C,另一条记录可能有B,C,D,当我执行GROUP BY COUNT时,我会得到A = 1,B = 2,C = 2和D = 1。
有没有简单的方法来做到这一点?
编辑在回答安德鲁answer:
因为我的这个结构的认识是肤浅的,充其量我与它摆弄得到它做我想做的。在我的实际代码中,我需要按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
作为一个侧面说明:有没有什么办法可以进一步减少呢?
这是一个旁注。 – user472875 2012-04-25 19:17:55
您可以将WHERE条件移至WITH查询,也可以将其删除几毫秒。 – Andrew 2012-04-25 21:59:36