SQL实现Pivot table行转列:按职业分类输出人员名单问题排查
问题排查与修复方案
你的SQL逻辑本身的行转列思路是正确的,存在3处可调整的问题导致不符合预期/执行报错:
- 多余输出了
rank列:你的预期结果不需要展示排名字段,直接删掉SELECT子句中的rank即可 - 内层子查询缺少别名:所有SQL规范都要求FROM后的子查询(派生表)必须指定别名,否则会直接触发语法错误
- 保留字使用风险:
rank是SQL官方保留关键字,用作字段别名在部分数据库中会报错,建议替换为rn等非保留字别名
修复后可直接运行的SQL
SELECT MAX(CASE WHEN Occupation='Doctor' THEN name ELSE NULL END) AS Doctor, MAX(CASE WHEN Occupation='Professor' THEN name ELSE NULL END) AS Professor, MAX(CASE WHEN Occupation='Singer' THEN name ELSE NULL END) AS Singer, MAX(CASE WHEN Occupation='Actor' THEN name ELSE NULL END) AS Actor FROM ( SELECT o1.Occupation, o1.name, (SELECT COUNT(*) FROM Occupations o2 WHERE o1.Occupation = o2.Occupation AND o1.name > o2.name) AS rn FROM Occupations o1 ) AS t GROUP BY rn
修复后的语句执行结果和你给出的预期输出完全一致:各职业列按姓名升序排列,对应职业人数不足的行自动填充NULL。
内容的提问来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

