2012-04-25 73 views
0

我有一個帶有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 

作爲一個側面說明:有沒有什麼辦法可以進一步減少呢?

+0

這是一個旁註。 – user472875 2012-04-25 19:17:55

+0

您可以將WHERE條件移至WITH查詢,也可以將其刪除幾毫秒。 – Andrew 2012-04-25 21:59:36

回答

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是需要的,因爲您不能在組子句中使用xml方法。

+0

感謝您的快速回復,我還沒有時間嘗試這個,但它看起來非常有前途。一旦我開始運行,我會讓你知道的。 – user472875 2012-04-25 16:54:29

+0

我根據你的回答編輯了我的問題。看看你是否有機會。 – user472875 2012-04-25 19:02:16

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