mysql查询拆分列成m

时间:2013-12-14 14:42:50

标签: mysql sql

我有以下数据库结构:

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`

3 个答案:

答案 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