如何将多个SELECT语句分别置于不同列中合并查询?
嘿,我帮你把这个查询相关的内容整理成清晰的Markdown格式,顺便给你一个更高效的完整查询方案:
需求概述
我们需要编写一个SQL查询,实现两个核心统计目标:
- 按军衔类别(Officer、NCO、Troop)分别统计男、女侦察兵的数量
- 额外统计所有侦察兵中男性、女性的总人数
现有查询片段
你目前已经写了部分嵌套子查询的代码,如下:
SELECT (Select count(Gender) from stormtroopers_officer join st_officer_assign on stormtroopers_officer.STID=st_officer_assign.STID where Gender='Female' AND st_officer_assign.Role = 'Scout') as 'FOScout', (SELECT count(Gender) from stormtroopers_nco join st_nco_assign on stormtroopers_nco.STID=st_nco_assign.STID where Gender='Female' AND st_nco_assign.Role = 'Scout') as 'FNCOScout', -- 此处缺失Troop类别的女性侦察兵统计,以及所有类别的男性侦察兵统计 -- 同时还未包含男女侦察兵的总数统计
优化后的完整查询
为了让查询更简洁易维护,我们可以用UNION ALL先把三个军衔表的侦察兵数据合并,再通过分组和条件聚合完成统计,同时直接输出总数:
WITH scout_troops AS ( -- 提取Officer类别的侦察兵数据 SELECT 'Officer' AS rank_category, Gender FROM stormtroopers_officer o JOIN st_officer_assign a ON o.STID = a.STID WHERE a.Role = 'Scout' UNION ALL -- 提取NCO类别的侦察兵数据 SELECT 'NCO' AS rank_category, Gender FROM stormtroopers_nco n JOIN st_nco_assign a ON n.STID = a.STID WHERE a.Role = 'Scout' UNION ALL -- 提取Troop类别的侦察兵数据 SELECT 'Troop' AS rank_category, Gender FROM stormtroopers_troop t JOIN st_troop_assign a ON t.STID = a.STID WHERE a.Role = 'Scout' ) -- 按军衔类别统计男女侦察兵数量 SELECT rank_category, SUM(CASE WHEN Gender = 'Female' THEN 1 ELSE 0 END) AS female_count, SUM(CASE WHEN Gender = 'Male' THEN 1 ELSE 0 END) AS male_count FROM scout_troops GROUP BY rank_category UNION ALL -- 统计所有侦察兵中的男女总人数 SELECT 'Total' AS rank_category, SUM(CASE WHEN Gender = 'Female' THEN 1 ELSE 0 END) AS female_count, SUM(CASE WHEN Gender = 'Male' THEN 1 ELSE 0 END) AS male_count FROM scout_troops;
这个方案用CTE(公共表表达式)先整合所有侦察兵数据,再通过两次分组分别输出各军衔类别的统计结果和总统计,结构清晰且后续修改扩展更方便。
内容的提问来源于stack exchange,提问作者Mohammad Alamri
相关产品推荐
相关产品推荐

