2013-12-14 75 views
0

我有以下的數據庫結構:MySQL查詢拆分柱爲m

FieldID|Year|Value 
a|2011|sugar 
a|2012|salt 
a|2013|pepper 
b|2011|pepper 
b|2012|pepper 
b|2013|pepper 
c|2011|sugar 
c|2012|salt 
c|2013|salt 

現在我想運行計數字段數爲每個項目在某一年看起來像這樣的查詢:

value|2011|2012|2013 
sugar|2|0|0 
salt |0|2|1 
pepper|1|1|2 

我以前每年都使用多個表格。然而,對於2011,2012和2013年不同的值可能是不同的(例如糖只會出現在2011年)

個別年份我用:

SELECT `Value`, COUNT(`FieldID`) FROM `Table` WHERE `Year`=2011 GROUP BY `Value` 

回答

0

A1ex07的回答很好。然而,在MySQL中,我更喜歡這個提法:

SELECT Value, 
     sum(`Year` = 2011) AS cnt2011, 
     sum(`Year` = 2012) AS cnt2012, 
     sum(`Year` = 2013) AS cnt2013 
FROM t 
GROUP BY value; 

採用count(. . .)產生正確的答案,但只是因爲缺少else條款。默認值是NULL,並沒有被計算。對我而言,這是一個容易出錯的結構。

如果你想在標準SQL上面,我去爲:

SELECT Value, 
     sum(case when `Year` = 2011 then 1 else 0 end) AS cnt2011, 
     sum(case when `Year` = 2012 then 1 else 0 end) AS cnt2012, 
     sum(case when `Year` = 2013 then 1 else 0 end) AS cnt2013 
FROM t 
GROUP BY value; 
+0

雖然我喜歡所有三種解決方案,但我給了這一個+1的額外解釋。但是,感謝大家爲此迅速解決此問題。 – user2386786

0

你可以做旋轉:

SELECT `Value`, 
COUNT(CASE WHEN `Year` = 2011 THEN FieldID END) AS cnt2011, 
COUNT(CASE WHEN `Year` = 2012 THEN FieldID END) AS cnt2012, 
COUNT(CASE WHEN `Year` = 2013 THEN FieldID END) AS cnt2013 
FROM `Table` 
GROUP BY `Value` 
0

這就是所謂的透視表,使用CASE語句鏈這對於每個條件應用1或0,則SUM實現( )將這些零和零檢索一個計數。

SELECT 
    Value, 
    SUM(CASE WHEN Year = 2011 THEN 1 ELSE 0 END) AS 2012, 
    SUM(CASE WHEN Year = 2012 THEN 1 ELSE 0 END) AS 2012, 
    SUM(CASE WHEN Year = 2013 THEN 1 ELSE 0 END) AS 2013 
FROM Table 
GROUP BY Value