SQL如何查询每日各分类占比:获取单日总计数计算百分比
解决方案
方法1:使用窗口函数(推荐,兼容所有支持SQL标准窗口函数的数据库,如MySQL 8.0+、PostgreSQL、SQL Server等)
直接在现有分组查询的基础上,用SUM() OVER (PARTITION BY event_day)窗口函数直接计算单日总记录数,再计算占比即可:
SELECT event_day, Category, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY event_day), 0) AS `%` FROM my_table GROUP BY event_day, Category;
说明:
SUM(COUNT(*)) OVER (PARTITION BY event_day)会先按event_day分组,把同一天内所有分类的count值求和,得到单日总记录数,不需要额外关联子查询,执行效率更高。
方法2:子查询关联(兼容不支持窗口函数的旧版本数据库,如MySQL 5.x)
先单独写子查询统计每天的总记录数,再和你现有的分组统计结果关联计算占比:
SELECT t1.event_day, t1.Category, ROUND(t1.category_count * 100.0 / t2.day_total, 0) AS `%` FROM ( -- 原有按天、分类统计数量的逻辑 SELECT event_day, Category, COUNT(*) AS category_count FROM my_table GROUP BY event_day, Category ) t1 JOIN ( -- 子查询统计单日总记录数 SELECT event_day, COUNT(*) AS day_total FROM my_table GROUP BY event_day ) t2 ON t1.event_day = t2.event_day;
两种方法执行后均可得到你需要的预期输出结果。
内容的提问来源于stack exchange,提问作者Marcin_S
相关产品推荐
相关产品推荐

