sql - 数据透视表将行转换为列
问题描述
姓名 | 职业 |
---|---|
萨曼莎 | 医生 |
朱莉娅 | 演员 |
玛丽亚 | 演员 |
米拉 | 歌手 |
阿什利 | 教授 |
凯蒂 | 教授 |
克里斯汀 | 教授 |
简 | 演员 |
珍妮 | 医生 |
普里亚 | 歌手 |
嗨,我有一个如上所述的餐桌 职业
我希望输出像
医生 | 教授 | 歌手 | 演员 |
---|---|---|---|
珍妮 | 阿什利 | 米拉 | 简 |
萨曼莎 | 克里斯汀 | 普里亚 | 朱莉娅 |
无效的 | 凯蒂 | 无效的 | 玛丽亚 |
我在下面尝试了这个 SELECT 语句,但它没有按预期工作:
SELECT rank,
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 ) rank
FROM Occupations o1)
GROUP BY rank
解决方案
似乎您需要按name
列对结果进行排序以及分析功能,例如ROW_NUMBER()
假设您的数据库版本至少为9i,例如
SELECT rank,
MAX(CASE WHEN occupation='Doctor' THEN name END) AS doctor,
MAX(CASE WHEN occupation='Professor' THEN name END) AS professor,
MAX(CASE WHEN occupation='Singer' THEN name END) AS singer,
MAX(CASE WHEN occupation='Actor' THEN name END) AS actor
FROM (
SELECT Occupation, name,
ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name)-1 rank
FROM Occupations
)
GROUP BY rank
ORDER BY rank
用ELSE NULL
例是多余的。
或者
您也可以使用PIVOT子句
SELECT *
FROM (
SELECT occupation, name,
ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY name)-1 rank
FROM Occupations
)
PIVOT (
MAX(name) FOR occupation IN ('Doctor' AS "Doctor",
'Professor' AS "Professor",
'Singer' AS "Singer",
'Actor' AS "Actor")
)
ORDER BY rank
推荐阅读
- angular - 从角度 6 中的数组中删除时检查循环中的验证(模板驱动形式)
- c++ - VS Code下调试基于bazel的C++项目
- java - 使用 Spring Boot Java 将文件写入安装在 AWS EC2 实例上的 Apache HTTPD 服务器
- javascript - 在while函数(nodejs)中运行mongodb函数时出错
- bash - 从列表中读取带有通配符的 url 并使用 lftp 下载
- amazon-web-services - 为什么在 Next.js 中发出请求时会有不同的主机头?
- javascript - JSX 中的 if 语句
- string - 在忽略大小写的情况下比较字符串的有效方法是什么?
- ruby-on-rails - 使用 pry 时立即在 Rails 控制台中同时评估多行代码?
- symfony - 错误 security.firewalls.access_control symfony