首页 > 解决方案 > Oracle SQL 多级数据透视组

问题描述

编辑:对于那些说这是一个明确而明显的“否”的人:当然,我认为是这种情况,并且分层标题超出了 SQL 查询结果的范围。但是,除了一些 Mysql 工作之外,我刚刚从旧的遗留 SQL Server 2000 平台跳转到 Oracle 12g,并在那里找到了我在 SS 2000 中无法想象的事情,所以我想我会问。我编写了大量的 SQL 来在一些报告创建系统中提供我的表示层,因此我正在探索从 SS 2000 开始的能力飞跃。

我可能对 Oracle Pivot 功能提出了太多要求,但这正是我想要做的。我可以在单个级别进行透视,但我想要一个具有多个度量的列分组层次结构,就像您可以在电子表格交叉表中轻松完成的那样。这是示例数据和所需的输出:

select * 
from(
   select 'A' rws, 'X' cols, 2 v1, 90 v2 from dual union
   select 'A' rws, 'Y' cols, 25 v1, 112 v2 from dual union
   select 'A' rws, 'Y' cols, 7 v1, 64 v2 from dual union
   select 'B' rws, 'X' cols, 4 v1, 117 v2 from dual union
   select 'B' rws, 'Y' cols, 46 v1, 32 v2 from dual union
   select 'B' rws, 'X' cols, 0 v1, 18 v2 from dual
)

这是我想要的输出:

-----------------------------------------------------------
|             A              |              B             |
-----------------------------------------------------------
|      X      |      Y       |      X       |      Y      |
-----------------------------------------------------------
|  v1  |  v2  |  v1  |  v2   |  v1  |  v2   |  v1  |  v2  |
-----------------------------------------------------------
|  2   |  90  |  32  |  176  |  4   |  135  |  46  |  32  |
-----------------------------------------------------------

标签: oracleplsqlpivot

解决方案


当然,您可以根据需要对数据进行透视,但您需要自己格式化表头,因为 Oracle 会返回标准表数据:

select * 
from(
   select 'A' rws, 'X' cols, 2 v1, 90 v2 from dual union
   select 'A' rws, 'Y' cols, 25 v1, 112 v2 from dual union
   select 'A' rws, 'Y' cols, 7 v1, 64 v2 from dual union
   select 'B' rws, 'X' cols, 4 v1, 117 v2 from dual union
   select 'B' rws, 'Y' cols, 46 v1, 32 v2 from dual union
   select 'B' rws, 'X' cols, 0 v1, 18 v2 from dual
) t
pivot 
(
   max(v1) as v1_,max(v2) as v2_
   for (rws,cols) in (
       ('A','X') as A_X,
       ('A','Y') as A_Y,
       ('B','X') as B_X,
       ('B','Y') as B_Y
   )
);

结果:

   A_X_V1_    A_X_V2_    A_Y_V1_    A_Y_V2_    B_X_V1_    B_X_V2_    B_Y_V1_    B_Y_V2_
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         2         90         25        112          4        117         46         32

推荐阅读