안녕하세요 구루비에서 많은 도움을 받고 있습니다.
with t as (
select 'kevin' name , '2017-0001' paperNm, '20170101' reqDate, '10000' totAmt, '20170103' recvDate, '7000' recvAmt from dual union all
select 'kevin' name , '2017-0001' paperNm, '20170101' reqDate, '10000' totAmt, '20170105' recvDate, '3000' recvAmt from dual union all
select 'tom' name , '2017-0002' paperNm, '20170103' reqDate, '50000' totAmt, '20170105' recvDate, '24000' recvAmt from dual union all
select 'tom' name , '2017-0002' paperNm, '20170103' reqDate, '50000' totAmt, '20170109' recvDate, '26000' recvAmt from dual union all
select 'jack' name , '2017-0003' paperNm, '20170106' reqDate, '7000' totAmt, '20170106' recvDate, '7000' recvAmt from dual
)select * from t
이런 데이터가 있는데요
제가 원하는 최종결과는
이름 청구서번호 청구일자 총금액 입금일자 입금액 순번
NAME PAPERNM REQDATE TOTAMT RECVDATE RECVAMT ord
총계 67000 670000
kevin 2017-0001 20170101 10000 20170103 7000 1차
kevin 2017-0001 20170101 0 20170105 3000 2차
tom 2017-0002 20170103 50000 20170105 24000 1차
tom 2017-0002 20170103 0 20170109 26000 2차
jack 2017-0003 20170106 7000 20170106 7000 -(한번에 내면 -)
이런 식입니다.
어떤고객이 청구서를 받으면 1차와 2차로 나눠서 내는 경우도 있고 한번에 내는 경우도 있습니다.
최종결과를 저렇게 보여주고 싶습니다.
with t as ( select 'kevin' name , '2017-0001' paperNm, '20170101' reqDate, '10000' totAmt, '20170103' recvDate, '7000' recvAmt from dual union all select 'kevin' name , '2017-0001' paperNm, '20170101' reqDate, '10000' totAmt, '20170105' recvDate, '3000' recvAmt from dual union all select 'tom' name , '2017-0002' paperNm, '20170103' reqDate, '50000' totAmt, '20170105' recvDate, '24000' recvAmt from dual union all select 'tom' name , '2017-0002' paperNm, '20170103' reqDate, '50000' totAmt, '20170109' recvDate, '26000' recvAmt from dual union all select 'jack' name , '2017-0003' paperNm, '20170106' reqDate, '7000' totAmt, '20170106' recvDate, '7000' recvAmt from dual ) select nvl(name,'total') name, papernm, reqdate, sum(decode(no,1,totamt,0)) totamt ,recvdate, sum(recvamt) , nvl2(no,decode(cnt,1,null,to_char(no)||'차'),null) ord from ( select name, papernm, reqdate, totamt, recvdate, recvamt , row_number() over(partition by name, papernm, reqdate order by recvdate) no , count(1) over(partition by name, papernm, reqdate) cnt from t ) group by rollup((name,papernm,reqdate,recvdate,no,cnt)) order by grouping_id(name,papernm,reqdate,recvdate,no,cnt) desc, name, papernm, reqdate, recvdate
WITH t AS ( SELECT 'kevin' name, '2017-0001' paperNm, '20170101' reqDate, 10000 totAmt, '20170103' recvDate, 7000 recvAmt FROM dual UNION ALL SELECT 'kevin', '2017-0001', '20170101', 10000, '20170105', 3000 FROM dual UNION ALL SELECT 'tom' , '2017-0002', '20170103', 50000, '20170105', 24000 FROM dual UNION ALL SELECT 'tom' , '2017-0002', '20170103', 50000, '20170109', 26000 FROM dual UNION ALL SELECT 'jack' , '2017-0003', '20170106', 7000, '20170106', 7000 FROM dual ) SELECT NVL(name, '총계') name , paperNm , reqDate , SUM(DECODE(rn, '1차', totAmt, 0)) totAmt , recvDate , SUM(recvAmt) , DECODE(SUM(totAmt), SUM(recvAmt), null, rn) ord FROM (SELECT name, paperNm, reqDate, totAmt, recvDate, recvAmt , ROW_NUMBER() OVER(PARTITION BY paperNm ORDER BY recvDate)||'차' rn FROM t ) GROUP BY ROLLUP((name, paperNm, reqDate, recvDate, rn)) ORDER BY paperNm NULLS FIRST ;
WITH t AS ( SELECT 'kevin' name, '2017-0001' paperNm, '20170101' reqDate, 10000 totAmt, '20170103' recvDate, 7000 recvAmt FROM dual UNION ALL SELECT 'kevin', '2017-0001', '20170101', 10000, '20170105', 3000 FROM dual UNION ALL SELECT 'tom' , '2017-0002', '20170103', 50000, '20170105', 24000 FROM dual UNION ALL SELECT 'tom' , '2017-0002', '20170103', 50000, '20170109', 26000 FROM dual UNION ALL SELECT 'jack' , '2017-0003', '20170106', 7000, '20170106', 7000 FROM dual ) SELECT NVL(name, '총계') name , paperNm , reqDate , SUM(DECODE(rn, '1차', totAmt, 0)) totAmt , recvDate , SUM(recvAmt) , DECODE(SUM(totAmt), SUM(recvAmt), null, rn) ord , ROUND( SUM(recvAmt) / DECODE(GROUPING(rn), 0, SUM(totAmt), SUM(DECODE(rn, '1차', totAmt, 0))) * 100, 2) r FROM (SELECT name, paperNm, reqDate, totAmt, recvDate, recvAmt , ROW_NUMBER() OVER(PARTITION BY paperNm ORDER BY recvDate)||'차' rn FROM t ) GROUP BY ROLLUP((name, paperNm, reqDate, recvDate, rn)) ORDER BY paperNm NULLS FIRST ;