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



我需要使用一个 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 s更改为UNION ALL s。 无需产生删除重复项的开销。

最新更新