2013-12-14 72 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