如何使用CASE WHEN语句统计COUNT列的计数分布
实现方法
首先你原查询里的DISTINCT是冗余的:按location_name分组后,每个门店名称本身就只会返回唯一一行,不需要额外去重,保留反而会增加不必要的查询开销。
要实现对门店记录数的二次频次统计,用CASE WHEN的核心思路是:先把「按门店统计记录数」的结果作为子查询,再在外层通过CASE WHEN匹配不同的计数值档位,匹配则记1、不匹配记0,最后用SUM聚合得到对应档位的门店总数。
横表输出(固定统计指定计数值对应的门店数)
如果需要明确统计「记录数为1的门店数、记录数为2的门店数……」这类固定档位,直接按需要扩展CASE WHEN分支即可,示例代码如下:
SELECT SUM(CASE WHEN record_count = 1 THEN 1 ELSE 0 END) AS store_count_with_1_record, SUM(CASE WHEN record_count = 2 THEN 1 ELSE 0 END) AS store_count_with_2_records, SUM(CASE WHEN record_count = 3 THEN 1 ELSE 0 END) AS store_count_with_3_records, -- 若需要统计3条及以上记录的门店数,可以放开下面这行 -- SUM(CASE WHEN record_count >= 3 THEN 1 ELSE 0 END) AS store_count_with_3plus_records FROM ( -- 内层先完成单门店的记录数统计 SELECT location_name, COUNT(*) AS record_count FROM fastfood GROUP BY location_name ) t;
纵表输出(自动统计所有存在的计数值对应门店数)
如果你不需要固定列输出所有档位,也可以直接按单门店的记录数二次分组,不需要写大量CASE WHEN就能自动返回所有计数值对应的门店个数,结果按计数值逐行展示:
SELECT record_count AS per_store_record_num, COUNT(location_name) AS matching_store_count FROM ( SELECT location_name, COUNT(*) AS record_count FROM fastfood GROUP BY location_name ) t GROUP BY record_count ORDER BY per_store_record_num;
说明:如果你的业务场景必须用
CASE WHEN实现,优先用第一种横表写法,按需增减需要统计的计数值分支即可。注意不要直接用COUNT作为列别名,它是SQL聚合关键字,容易触发语法兼容问题。
内容的提问来源于stack exchange,提问作者rnpython
相关产品推荐
相关产品推荐

