如何合并单用户与全用户年度月度统计查询结果至同一表格?
合并单用户与全用户月度统计数据
可以用条件聚合的方式,把两个查询的逻辑合并到一条SQL语句中,直接生成你需要的三列结果,无需额外关联两次查询的结果,效率更高:
SELECT MONTH(date) AS month, COUNT(CASE WHEN userid = 'x' THEN 1 END) AS user, COUNT(*) AS all FROM DB_NAME WHERE YEAR(date) = YEAR(CURDATE()) GROUP BY month ORDER BY month;
逻辑说明:
COUNT(CASE WHEN userid = 'x' THEN 1 END):仅统计用户x的记录,不满足条件时CASE返回NULL,COUNT会自动忽略NULL值,最终得到该用户的月度计数COUNT(*):统计所有符合年份条件的记录,得到全用户的月度计数GROUP BY month:按月份分组,和原查询逻辑保持一致ORDER BY month:保证结果按月份顺序排列,属于可选优化但更符合展示需求
如果需要确保全年1-12月都有记录(即使某个月无数据也显示0),可以结合生成月份表的方式实现:
WITH months AS ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) SELECT m.month, COUNT(CASE WHEN d.userid = 'x' THEN 1 END) AS user, COUNT(d.date) AS all FROM months m LEFT JOIN DB_NAME d ON MONTH(d.date) = m.month AND YEAR(d.date) = YEAR(CURDATE()) GROUP BY m.month ORDER BY m.month;
这个版本会返回全年12个月份的统计结果,无数据的月份user和all列将显示0,结果更完整。
内容的提问来源于stack exchange,提问作者Naiorbi
相关产品推荐
相关产品推荐

