SQL pivot将数据排列为12个月的输出

时间:2018-01-25 02:48:48

标签: sql oracle pivot

我有一个名为:ListOfdates的表

 TYPE  |    O_DATE    |   C_DATE     |
+------+-------------+---------------+
   A     15-JAN-2017       (NULL)
   A     15-JAN-2017       (NULL)
   A     15-JAN-2017     25-APR-2017
   A     15-JAN-2017       (NULL)
   A     24-FEB-2017       (NULL)
   A     15-MAY-2017       (NULL)
   B     15-MAY-2017     25-MAY-2017
   C     15-MAY-2017       (NULL)
   D     15-MAY-2017     26-MAY-2017
   A     15-MAY-2017       (NULL)`   

我想把它安排到下面,

`MONTH |  Type A   |Total|  Type B   |Total|  Type C   |Total|  Type D   |Total|
       | A_o | A_c | T_o | B_o | B_c | T_o | C_o | C_c | T_o | D_o | D_c | T_o |
JAN    |  4  |  0  |  4  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
FEB    |  1  |  0  |  5  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
MAR    |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
APR    |  0  |  1  |  4  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
MAY    |  2  |  0  |  6  |  1  |  0  |  0  |  1  |  0  |  0  |  0  |  1  |  0  |
JUN    |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
...`

条件是,

o_date将添加一个计数以打开月份并输入。

如果c_date不为null,它将为该月的关闭添加一个计数并输入

否则如果c_date为null,则不会计算结束。

此外,从年初开始累计的每种类型的开放数量总计。

必须显示所有12个月。

首字母缩略词是:

`O_DATE = open date
C_DATE = close date
A_o = Type A open
A_c = Type A close
B_o = Type A open
B_c = Type B close
C_o = Type C open
T_o = Total open for the type (example may have 2 type A that is open)

etc...`

有没有办法在带有数据透视的sql中执行此操作?

1 个答案:

答案 0 :(得分:0)

我会使用条件聚合来做到这一点,但首先你必须取消数据的转换:

select to_char(dte, 'MON'),
       sum(case when type = 'A' then open else 0 end) as A_o, 
       sum(case when type = 'A' then close else 0 end) as A_c, 
       sum(case when type = 'A' then 1 else 0 end) as A_total, 
       . . .
from ((select type, o_date as dte, 1 as open, 0 as close from t) union al
      (select type, c_date as dte, 0 as open, 1 as close from t)
     ) oc
group by to_char(dte, 'MON')
order by min(dte);