我有这张桌子:
Month Type
JAN A
JAN A
FEB B
FEB B
FEB A
FEB A
我想运行一个按月分组的查询,并计算该月某个类型的出现次数。
所以对于上表,输出应该是:
A B
JAN 2 0
FEB 2 2
这可能是不可能的,但我想我会试一试。谢谢你。
我有这张桌子:
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
现在,如果您想动态执行此操作,这意味着您事先不知道要转置的列,那么您应该查看以下文章:
您的代码如下所示:
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 本身指定可变数量的列。您可以对查询做的最好的事情是分组Month
,然后Type
:
SELECT COUNT(*)
FROM table
GROUP BY Month, Type
这样你最终会得到:
JAN A 2
JAN B 0
FEB A 2
FEB B 2
可以在任何编程语言中以最小的努力将其转换为或视为数据透视表(如您的示例)。