mysql查询将列拆分为m

标签 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`

最佳答案

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;

关于mysql查询将列拆分为m,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584623/

相关文章:

php - PHP 或 MySQL 中的业务逻辑?

php - 删除行后重置 auto_increment

mysql - Rails 切换数据库

SQL 2008全文索引填充延迟

mysql - 在 mysql 中使用默认函数拆分 MySql 值?

php - 在同一页面和表单中获取结果

mysql - 在表 JOIN 期间实际发生了什么?

sql - PLSQL 异常回滚

MySQL查询时间间隔

php - 如何在最短的处理时间内获取分页的总行数。