首页 > 解决方案 > 如何使用具有 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。

标签: sqloraclepivotunpivot

解决方案


推荐阅读