我需要使用一个 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/