0

我有这张桌子:

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

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

        A     B
JAN     2     0
FEB     2     2

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

4

2 回答 2

3

不幸的是 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

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

动态数据透视表(将行转换为列)

您的代码如下所示:

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

于 2012-08-24T22:29:33.613 回答
1

您不能仅使用 SQL 本身指定可变数量的列。您可以对查询做的最好的事情是分组Month,然后Type

SELECT COUNT(*)
FROM table
GROUP BY Month, Type

这样你最终会得到:

JAN   A   2
JAN   B   0
FEB   A   2
FEB   B   2

可以在任何编程语言中以最小的努力将其转换为或视为数据透视表(如您的示例)。

于 2012-08-24T22:13:28.607 回答