在Oracle中转置列

时间:2014-12-12 10:56:44

标签: oracle oracle11g pivot

我要求我必须以下列格式返回数据:

Batch Id  Element1  Element2 Element3  .. Element n  Date
------------------------------------------------------------
1        0.25      1.5      3.5           2.2        1/12/2014
2        1.3       2.3      5.5           1.1        5/12/2014
3        4.5       5.5      4.3           6.3        7/12/2014
..        ..       ..       ..            ..         ..
n        1.5       2.3      5.5           9.3       12/12/2014
----------------------------------------------------------------

我有两个表,其中数据以下列格式存储: 表1:

Batch Id  CreatedBy   Date
-----------------------------------------------
1         ABC         1/12/2014
2         PQR         5/12/2014
3         XYZ         7/12/2014
..        ..          ..
n         YYY         12/12/2014
----------------------------------------------

表2:

Batch Id  Element           Value
-----------------------------------------------
1         Element1          0.25
1         Element2          1.5
1         Element3          3.5
..        ..                ..
1         Elementn          2.2

2         Element1          1.3
2         Element2          2.3
2         Element3          5.5
..        ..                ..
2         Elementn          6.3

.         .                 .
.         .                 .
.         .                 .
n         Element1          1.5
n         Element2          2.3
n         Element3          5.5
..        ..                ..
n         Elementn          9.3
----------------------------------------------

我的问题是如何在表2中转置记录[即元素及其价值]以所需格式显示我的结果?请注意,每个批次中的元素数量不相同。但我有可以出现的最大元素列表。

任何建议都将不胜感激。

谢谢! 最好的祝福, 库纳尔

1 个答案:

答案 0 :(得分:1)

使用透视操作解决方法

  1. 构造一个查询,其中表与必要的列连接(假设内连接):batch_id,batch_date,element,value

  2. 假设每批一个元素值(因此求和是一个有效的函数)。关键是这需要是一个聚合函数。

  3. 使用此处的语法Oracle 11g Pivoting Operations添加pivot子句。

  4. 使用pivot子句的for部分,您可以对聚合进行分段/创建新元素列。

  5. SELECT batch_id, element1, element2, --assume finite list elementn, batch_date FROM (SELECT batch.batch_id, batch.DATE batch_date, batch_element.element b_element, batch_element.value b_value FROM table1 batch JOIN table2 batch_element ON batch.batch_id = batch_element.batch_id --assume want to see only batches with elements ) pivot (sum(b_value) FOR b_element IN (('Element1') AS element1, ('Element2') AS element2, ('Element3') AS element3, ('Element4') AS element4, ... --assume finite list as indicated ('ElementN') AS elementn ));

    以下是使用示例scott模式的示例,其中平均工资按作业计算:

    SCOTT@dev> SELECT job,
      2    accounting,
      3    research,
      4    sales
      5  FROM
      6    (SELECT d.dname,
      7      e.job,
      8      e.sal
      9    FROM dept d
     10    LEFT JOIN emp e
     11    ON d.deptno                  = e.deptno
     12    ) pivot (avg(sal) FOR dname IN ('ACCOUNTING' AS accounting, 'RESEARCH' AS research, 'SALES' AS sales))
     13  /
    
    JOB       ACCOUNTING   RESEARCH      SALES
    ========= ========== ========== ==========
    
    CLERK           1300        950        950
    SALESMAN                              1400
    PRESIDENT       5000
    MANAGER         2450       2975       2850
    ANALYST                    3000
    
    6 rows selected.