我有以下数据库结构:
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 :(得分: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`
答案 1 :(得分: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;
答案 2 :(得分:0)
它被称为数据透视表,使用一系列CASE语句实现,每个条件应用1或0,然后用SUM()向上和0来检索计数。
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