You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:18:34