【问题标题】:Multiply the number of columns by the number of rows将列数乘以行数
【发布时间】: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(应用程序或网站)中的网格/表格中。

标签: sql oracle pivot


【解决方案1】:

您可以使用条件聚合:

select max(case when type = 1 then prop_x end) as prop_x_1,
       max(case when type = 2 then prop_x end) as prop_x_2,
       max(case when type = 3 then prop_x end) as prop_x_3,
       max(case when type = 4 then prop_x end) as prop_x_4,
       max(case when type = 1 then prop_y end) as prop_y_1,
       . . .
from my_table;

【讨论】:

    【解决方案2】:

    pivot 的解决方案 - 仅适用于有限的行数(并且 1_prop_x 而不是 prop_x_1 加上列的顺序与问题不同,但对我来说没问题):

      select * 
      from 
      (
      select *
      from my_table t
      )
      pivot(
      max(prop_x) as prop_x, max(prop_y) as prop_y, max(prop_z) as prop_z
      for type in (1,2,3,4)
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多