SQL数据处理需求:转换教练状态并统计总数及各状态数量
解决方案:实现教练状态标记与统计列需求
方案1:使用子查询(兼容所有SQL方言)
SELECT id, type, CASE WHEN status IN (1.0, TRUE) THEN 'Active' ELSE 'Inactive' END AS Status, -- 统计教练总数量 (SELECT COUNT(*) FROM your_table WHERE type = 'coach') AS totalcount, -- 统计对应状态的教练数量 CASE WHEN status IN (1.0, TRUE) THEN (SELECT COUNT(*) FROM your_table WHERE type = 'coach' AND status IN (1.0, TRUE)) ELSE (SELECT COUNT(*) FROM your_table WHERE type = 'coach' AND status NOT IN (1.0, TRUE)) END AS `status count` FROM your_table WHERE type = 'coach';
方案2:使用窗口函数(高效,适用于MySQL 8+、PostgreSQL、SQL Server等)
窗口函数避免了重复子查询,数据量大时性能更优:
SELECT id, type, CASE WHEN status IN (1.0, TRUE) THEN 'Active' ELSE 'Inactive' END AS Status, -- 全局统计所有教练数量 COUNT(*) OVER () AS totalcount, -- 按状态分组统计对应数量 COUNT(*) OVER ( PARTITION BY CASE WHEN status IN (1.0, TRUE) THEN 'Active' ELSE 'Inactive' END ) AS `status count` FROM your_table WHERE type = 'coach';
关键逻辑说明
- 状态列生成:通过
CASE判断status是否为1.0或True,标记为Active或Inactive,同时过滤出type='coach'的记录。 - totalcount列:统计所有教练的总数量,两种方案分别用子查询和全局窗口函数实现。
- status count列:根据当前行的状态,统计对应状态的教练总数,子查询方案通过条件子查询实现,窗口函数方案通过
PARTITION BY按状态分组统计。
内容的提问来源于stack exchange,提问作者Shivam
相关产品推荐
相关产品推荐

