MySQL 当年每月平均计数(包括没有数据的月份)

标签 mysql stored-procedures

我正在尝试创建一个条形图查询,该图显示订单数量的每月概览。

我使用的查询正确地为我提供了每月的分割,但是当我跳过一个月时,它没有提供该月的0,只是根本不添加它。

由于此图表预计有 12 个数字,因此缺失月份之后的所有内容都会不准确。

当前尝试:

select Month(dateCreated) as monthID,
   Monthname(dateCreated) as monthName,
   count(dateCreated) as totalRewards
from reward
where Year(dateCreated) = '2018'
GROUP BY monthID

enter image description here

如果我们假设当前是 2018 年 5 月,我想查看 1 月至 5 月的当前计数,即使该月没有订单(4 月 = 0)。

包含所提供年份中迄今为止发生的所有月份及其适当计数的最佳方式是什么?

最佳答案

您可以模拟月份表,然后针对它LEFT JOIN reward 表。为了确保您只获得有效结果,最好使用非空的 SUM() 而不是 COUNT() 聚合:

SELECT
    months.id as monthID,
    MONTHNAME(CONCAT('2018-',months.id,'-01')) as monthName,
    SUM(CASE WHEN dateCreated IS NULL THEN 0 ELSE 1 END) as totalRewards
FROM
(
    SELECT 1 AS id
    UNION SELECT 2
    UNION SELECT 3
    UNION SELECT 4
    UNION SELECT 5
    UNION SELECT 6
    UNION SELECT 7
    UNION SELECT 8
    UNION SELECT 9
    UNION SELECT 10
    UNION SELECT 11
    UNION SELECT 12
) as months
LEFT JOIN reward
   ON MONTH(reward.dateCreated) = months.id
   AND YEAR(dateCreated) = '2018'
GROUP BY monthID, monthName
ORDER BY monthID;

SQL Fiddle

关于MySQL 当年每月平均计数(包括没有数据的月份),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48372765/

相关文章:

php - 目录中记录的文件名与数据库不同

mysql - InnoDB 中的自动增量值?

mysql - Prestashop 的 MyISAM 或 InnoDB 数据库?

java - 在这种特殊情况下,我们应该使用 Java 代码来选择数据还是使用存储过程?

c# - 如何使用 ADO.NET 和存储过程在数据库中保存复杂的 C# 对象?

SQL Server 2008 存储过程 - 优化器认为我的参数可以为空

PHP - 将数据库 ID 附加到变量

mysql - 在 mysql 上创建查询

java - 在 Web 服务中包装存储过程的最简单方法是什么?

MySQl 5.6.28 尝试在 select 语句中将变量传递给 limit 时出错