mysql - 将列数据转换为列并按其分组

标签 mysql

我有这张表:

Month    Type
JAN        A
JAN        A
FEB        B
FEB        B
FEB        A
FEB        A

我想运行一个按月分组的查询,并计算该月某个类型的出现次数。
所以对于上表,输出应该是:

        A     B
JAN     2     0
FEB     2     2

这可能是不可能的,但我想我会试一试。 谢谢。

最佳答案

不幸的是,MySQL 没有 PIVOT 函数,这基本上就是您要尝试做的。因此,您需要使用带有 CASE 语句的聚合函数:

SELECT Month,
  SUM(case when type = 'A' then 1 ELSE 0 END) as A,
  SUM(case when type = 'B' then 1 ELSE 0 END) as B
FROM yourTable
GROUP BY month

参见 SQL Fiddle with Demo

现在,如果您想动态地执行此操作,这意味着您事先不知道要转置的列,那么您应该查看以下文章:

Dynamic pivot tables (transform rows to columns)

您的代码如下所示:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(case when type = ''',
      type,
      ''' then 1 ELSE 0 END) AS ',
      type
    )
  ) INTO @sql
FROM test;

SET @sql = CONCAT('SELECT month, ', @sql, ' FROM test GROUP BY month');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

参见 SQL Fiddle with Demo

关于mysql - 将列数据转换为列并按其分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117166/

相关文章:

mysql - findAllByPropertyInList 结果错误,JOIN 相关或 hibernate Distinct/分页问题?

php - 在php中同时从两个MySQL表中选择数据

javascript - 我正在尝试通过验证创建此登录/注册表单

mysql - 在 clojure 中使用PreparedStatements进行选择

php - 如何在 PHP 中回显 count(*) AS 的结果?

mysql - 如何将权限 "LOAD FROM INFILE"添加到我的数据库?

mysql - 在sql中找到每个组中第二高的?

mysql - 显示 LEFT JOIN 中不存在的 Mysql 查询结果

php - 使用数组内爆构建插入查询

php - Laravel 从表单输入中将 "null"插入数据库。