sql - 如何使用具有 varchar 列的 unpivot 和 pivot 转置表?
问题描述
我有这张桌子
+----------------------+----------+--------------+---------+
|ATTRIBUTE |Condition |VALUE |Person |
+----------------------+----------+--------------+---------+
|Description of Change |Contains |description |XYZ-1 |
|Description of Change |Contains |datacore |XYZ-2 |
|Description of Change |Contains |pulse |XYZ-2 |
|Item Description |Contains |Test Module |XYZ-3 |
|Item Number |Equal To |595-1266-00 |XYZ-4 |
|Item Number |Equal To |595-1268-00 |XYZ-5 |
|Item Description |Contains |ADR |XYZ-6 |
+----------------------+----------+--------------+---------+
我想转置并以这种形式显示结果:
+-------+-----------------------+-----------------+------------+
|Person |Description of Change |Item Description |Item Number |
+-------+-----------------------+-----------------+------------+
| |Contains |Contains |Equal To |
|XYZ-1 |description |[NULL] |[NULL] |
|XYZ-2 |datacore |[NULL] |[NULL] |
|XYZ-2 |pulse |[NULL] |[NULL] |
|XYZ-3 |[NULL] |Test Module |[NULL] |
|XYZ-4 |[NULL] |[NULL] |595-1266-00 |
|XYZ-5 |[NULL] |[NULL] |595-1268-00 |
|XYZ-6 |[NULL] |ADR |[NULL] |
+-------+-----------------------+-----------------+------------+
在这里,可以看出 ATTRIBUTE 和 Condition 将形成唯一的配对,并且 Person 可能会重复多个条目。
经过大量研究,我所做的并不令人满意,如图所示:
WITH cte AS (
SELECT DISTINCT "ATTRIBUTE", "Condition", VALUE, Person
FROM mytable
)
SELECT * FROM cte
UNPIVOT(
(temp) FOR entry IN ("ATTRIBUTE","Condition", VALUE, Person)
)
pivot(
max(temp) FOR entry IN ('ATTRIBUTE' "ATTRIBUTE",'Condition' "Condition", 'VALUE' VALUE, 'Person' Person)
)
仅选择一行。
也许我没有正确使用 PIVOT 和 UNPIVOT,或者这个问题没有解决方案。我可以用某种编程语言编写代码来完成这项工作,但我不得不坚持使用 SQL。
解决方案
推荐阅读
- javascript - 使用 Javascript 访问 html 表
- ruby - 对哈希键数组进行排序
- postgresql - 变量声明
- javascript - 如何使用 Reactjs 将日历的日期状态发送到另一个日历?
- laravel - 在 heroku 部署 octobercms 上找不到 css/js 或图像
- python - 如果地址发生变化,如何将设备的 IP 地址合并到 Python 脚本中
- javascript - 复选框只生效一次
- php - 如何从 HTML 属性中的文件名中删除 Wordpress 图像大小?
- c# - FirefoxProfile 的路径太长异常
- javascript - Javascript fetch 未捕获错误,跳过过去的 catch 语句