0

この表を考えると:

CREATE TABLE positions
   (    "EMP_ID" CHAR(10 BYTE), 
    "GTYPE" NUMBER, 
    "AMT" NUMBER, 
    "START_DATE" DATE, 
    "STOP_DATE" DATE
   )

そしてこのデータ:

 Insert Into positions (Emp_Id,Gtype,Amt,Start_Date,Stop_Date)
   select 'XA0022',1,1000,'01-MAY-2010','08-MAY-2012' from dual union
   Select 'XA0022',1,1000,'01-MAY-2010','31-DEC-2012' From Dual Union
   Select 'XA0022',2,500,'03-APR-2012','15-JUL-2012' From Dual Union
   Select 'XA0022',1,421,'01-MAY-2012','23-MAY-2012' From Dual Union
   Select 'XA0022',1,1514,'09-MAY-2012','31-DEC-2012' From Dual union
   select 'XA0022',1,600,'24-MAY-2012','24-MAY-2012' from dual;

どうすればこれに到達できますか:

from            to          type1   type2
   01-May-2010  02-Apr-2012     2000    0
   03-Apr-2012  30-Apr-2012     2000    500
   01-May-2012  07-May-2012     2421    500
   08-May-2012  08-May-2012     2421    500
   09-May-2012  22-May-2012     2935    500
   23-May-2012  23-May-2012     2935    500
   24-May-2012  15-Jul-2012     3114    500
   16-Jul-2012  31-Dec-2012     3014    0

注:金額はstart_dateに有効であり、stop_dateの翌日には有効ではありません。

どんなポインタもありがたいことに受け取りました!

4

1 に答える 1

0

Oracle のピボットを使用します。

オラクルピボット

select * from
(select emp_id, gtype, amt, start_date, stop_date
from positions)
pivot (sum(amt) as amt for (gtype) in (1 as "TYPE1", 2 as "TYPE2"))
order by emp_id, start_date;

もう少し情報があれば(ありがとう)、このようなものはありますか?

select emp_id, gtype, start_date, 
case when next_amt <> amt then next_start_date -1 end as to_date
from
(select emp_id, gtype, start_date, amt,
lead(start_date,1) over (order by emp_id, start_date) next_start_date,
lead(amt,1) over (order by emp_id, start_date) next_amt
from
positions)
于 2012-05-28T01:53:54.517 に答える