【发布时间】:2019-06-09 14:29:59
【问题描述】:
我有一张这样的桌子:
+------+--------+--------+--------+
| TYPE | PROP_X | PROP_Y | PROP_Z |
+------+--------+--------+--------+
| 1 | x1 | y1 | z1 |
| 2 | x2 | y2 | z2 |
| 3 | x3 | y3 | z3 |
| 4 | x4 | y4 | z4 |
+------+--------+--------+--------+
我怎样才能得到这样的结果:
+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| PROP_X_1 | PROP_X_2 | PROP_X_3 | PROP_X_4 | PROP_Y_1 | PROP_Y_2 | PROP_Y_3 | PROP_Y_4 | PROP_Z_1 | PROP_Z_2 | PROP_Z_3 | PROP_Z_4 |
+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| x1 | x2 | x3 | x4 | y1 | y2 | y3 | y4 | z1 | z2 | z3 | z4 |
+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
我猜,运营商PIVOT 可以用于此,但我不明白如何。
附:为表创建脚本:
create table my_table(type number(1), prop_x varchar2(30 char), prop_y varchar2(30 char), prop_z varchar2(30 char));
insert into my_table select 1 as type, 'x1' as prop_x, 'y1' as prop_y, 'z1' as prop_z from dual union all select 2, 'x2', 'y2', 'z2' from dual union all select 3, 'x3', 'y3', 'z3' from dual union all select 4, 'x4', 'y4', 'z4' from dual;
commit;
UPD:首先,我需要解决方案,至少对于 type 仅在 (1,2,3,4) 中的情况
【问题讨论】:
-
您只能使用
PIVOT,如果您将查询限制在某些行,例如键入 1、2、3 和 4。原因是 SQL 查询始终具有固定列。如果您想让它适用于可变数量的列(即您的表中的任何行),那么您需要动态 SQL。这基本上是:选择所有类型,然后根据找到的类型创建一个新查询。但是,您通常会选择所有未格式化的数据,然后将它们放入 GUI(应用程序或网站)中的网格/表格中。