mysql - 统计最近 X 天内每天的多个状态

标签 mysql sql select group-by

我正在尝试进行查询以按天计算过去 X 天内的多个状态。 我可以进行查询来计算这些,但输出并不是我想要的,也许我的 GROUP BY 语句中有错误。这就是我现在所拥有的:

示例表:

date - status
02-12-2015 - 1
02-12-2015 - 1
02-12-2015 - 3
02-12-2015 - 2
03-12-2015 - 1
03-12-2015 - 2

我的查询:

SELECT
    DATE_FORMAT( STR_TO_DATE( crdate , "%d-%m-%Y %H:%i:%S" ) , "%d-%m-%y" ) as date , COUNT(*) as countone
FROM TBL_NAME
WHERE status='1'
UNION
SELECT
    DATE_FORMAT( STR_TO_DATE( crdate , "%d-%m-%Y %H:%i:%S" ) , "%d-%m-%y" ) as date , COUNT(*) as counttwo
FROM TBL_NAME
WHERE status='2'
UNION
SELECT
    DATE_FORMAT( STR_TO_DATE( crdate , "%d-%m-%Y %H:%i:%S" ) , "%d-%m-%y" ) as date , COUNT(*) as countthree
FROM TBL_NAME
WHERE status='3'
GROUP BY DATE_FORMAT( STR_TO_DATE( crdate , "%d-%m-%Y %H:%i:%S" ) , "%d-%m-%y" ), status ORDER BY DATE_FORMAT( STR_TO_DATE( crdate , "%d-%m-%Y %H:%i:%S" ) , "%d-%m-%y" ) ASC

它应该有以下输出:

date - countone - counttwo - countthree
02-12-2015 - 2 - 1 - 1
03-12-2015 - 1 - 1 - 0

问题是我的输出仅按日期分组。 我的输出如下:

date - countone
02-12-2015 - 2
02-12-2015 - 1
02-12-2015 - 1
03-12-2015 - 1
03-12-2015 - 1

有人可以帮助我实现这个目标吗?我错了什么?

最佳答案

您可以首先使用 group by 计算状态计数,然后旋转表以获得所需的结果。联合函数将始终连接行。

select datefield,
    max(if(status=1,count,0)) as countone,
    max(if(status=2,count,0)) as counttwo,
    max(if(status=3,count,0)) as countthree
from (select datefield, status, count(*) as count
        from TBL_NAME
        group by datefield,status) A
group by datefield;

检查它的 SQL fiddle 设置 SQL Fiddle

关于mysql - 统计最近 X 天内每天的多个状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34046584/

相关文章:

php - 使用 Laravel 迁移添加 'on update' 和 'on delete' 外键约束

mysql - 返回结果取决于没有自连接的多行的条件

c++ - select() 总是返回 0

mysql没有问题

javascript - 如何使用javascript从选择标签中获取选定值并使用该值转到另一个页面

php - 域如何访问子域数据?

php - 将测试服务器文件传输到实时服务器并避免错误

mysql - 为多个重复项获取一条记录

sql - 在同一个表中查询 MS SQL Server 中的数据库列表

mysql - SQL 查询中的问题