mysql - 在单个 SELECT 语句中获取数据的每月分布

标签 mysql sql

我需要使用一个 mysql 语句每月分发我的数据。以下语句的预期结果: 一个包含 12 行的表。如果某一个月没有可用数据,则该月应返回 0。但是,如果数据丢失,则当前 SQL 语句的结果中会丢失一行或多行。我缺少什么?

SELECT m.Month as m1, MONTH(FROM_UNIXTIME(crdate)) as m2,
SUM(CASE WHEN keylock = 1 THEN 1 ELSE 0 END) AS c1, SUM(CASE WHEN keylock = 2 THEN 1 ELSE 0 END) AS c2
FROM tx_bhm_domain_model_access a 
RIGHT OUTER JOIN (
    SELECT 1 AS Month 
    UNION SELECT 2 AS Month 
    UNION SELECT 3 AS Month 
    UNION SELECT 4 AS Month 
    UNION SELECT 5 AS Month 
    UNION SELECT 6 AS Month 
    UNION SELECT 7 AS Month 
    UNION SELECT 8 AS Month 
    UNION SELECT 9 AS Month
    UNION SELECT 10 AS Month 
    UNION SELECT 11 AS Month 
    UNION SELECT 12 AS Month ) m
ON MONTH(FROM_UNIXTIME(a.crdate)) = m.Month
WHERE YEAR(FROM_UNIXTIME(a.crdate))=2018 
GROUP BY m.Month
ORDER BY m.Month

最佳答案

YEAR() 比较需要放在 ON 子句中。我更喜欢LEFT JOIN:

SELECT m.Month as m1, MONTH(FROM_UNIXTIME(crdate)) as m2,
       SUM(CASE WHEN keylock = 1 THEN 1 ELSE 0 END) AS c1,
       SUM(CASE WHEN keylock = 2 THEN 1 ELSE 0 END) AS c2
FROM (SELECT 1 AS Month UNION ALL
      SELECT 2 AS Month UNION ALL 
      SELECT 3 AS Month UNION ALL
      SELECT 4 AS Month UNION ALL 
      SELECT 5 AS Month UNION ALL
      SELECT 6 AS Month UNION ALL
      SELECT 7 AS Month UNION ALL
      SELECT 8 AS Month UNION ALL
      SELECT 9 AS Month UNION ALL
      SELECT 10 AS Month UNION ALL
      SELECT 11 AS Month UNION ALL
      SELECT 12 AS Month
     ) m LEFT JOIN
     tx_bhm_domain_model_access a
     ON MONTH(FROM_UNIXTIME(a.crdate)) = m.Month AND
        YEAR(FROM_UNIXTIME(a.crdate)) = 2018 
GROUP BY m.Month
ORDER BY m.Month;

我还将 UNION 更改为 UNION ALL。无需承担删除重复项的开销。

关于mysql - 在单个 SELECT 语句中获取数据的每月分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374135/

相关文章:

mysql - 如何正确调用不带out参数的MySQL存储过程?

Mysql查询使用日期获取最新数据

mysql - MYSQL 如何将一个表中的最新行连接到另一个表

sql - 按给定序列将二进制转换为十进制

sql - 空数据库的通用 SQL 查询

mysql - 显示表中不匹配的记录?

php - 将数据保存到 MySQL 并使用该数据更新页面而无需刷新

mysql - 如何在mysql查询中的另一个选择(子查询)中使用选择?

mysql - 寻找 MYSQL 中日期时间的解码算法。查看示例,解决方案奖励

sql - 将商或更长的表达式分配给局部(实数)变量 T SQL