Oracle 10:在不使用pivot和unpivot

时间:2015-11-19 11:46:02

标签: oracle

我正在使用Oracle 10,因此我无法使用PIVOT和UNPIVOT。我的问题如下。请假设你有这个Oracle表:

enter image description here

我想编写一个Oracle查询,在不使用PIVOT / UNPIVOT的情况下生成以下输出:

enter image description here

在源表中,您可以看到我有两个主要数据块:与2015年2月相关的日期,以及与2015年3月相关的日期。

(KEY1,KEY2)=(11111,A)出现在2015年2月,而2015年3月缺席。

(KEY1,KEY2)=(55555,E)2015年2月缺席,并于2015年3月出现。

请帮我编写查询以产生所需的输出。

非常感谢您考虑我的要求。

编辑#01:请假设表中只有两个具有两个不同日期的大块。例如,2015年1月1日的1,000,037条记录和2015年1月1日的999,967条记录(仅作为示例)。

编辑#02:Oracle数据库10g企业版10.2.0.5.0版 - 64bi

1 个答案:

答案 0 :(得分:1)

我希望下面会有效。

  SELECT key1,
         key2,
         MAX ("01/02/2015") AS "01/02/2015",
         MAX ("01/03/2015") AS "01/03/2015"
    FROM (SELECT a.KEY1,
                 a.KEY2,
                 CASE
                    WHEN A.DATE1 = TO_DATE ('01/02/2015', 'DD/MM/YYYY')
                    THEN
                       a.VALUE
                 END
                    AS "01/02/2015",
                 CASE
                    WHEN a.DATE1 = TO_DATE ('01/03/2015', 'DD/MM/YYYY')
                    THEN
                       a.VALUE
                 END
                    AS "01/03/2015"
            FROM TABLE2 a)
GROUP BY key1, key2
ORDER BY key1;

修改

而不是编写嵌套选择你也可以在单个查询中执行

  SELECT a.KEY1,
         a.KEY2,
         MAX (
            CASE
               WHEN A.DATE1 = TO_DATE ('01/02/2015', 'DD/MM/YYYY') THEN a.VALUE
            END)
            AS "01/02/2015",
         MAX (
            CASE
               WHEN a.DATE1 = TO_DATE ('01/03/2015', 'DD/MM/YYYY') THEN a.VALUE
            END)
            AS "01/03/2015"
    FROM TABLE2 a
GROUP BY key1, key2
ORDER BY key1;