1차 2차 구분과 같은 총금액 한번만 표시하기 0 7 777

by 푸릉이 [SQL Query] [2017.11.08 16:46:31]


안녕하세요 구루비에서 많은 도움을 받고 있습니다.

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차로 나눠서 내는 경우도 있고 한번에 내는 경우도 있습니다.

최종결과를 저렇게 보여주고 싶습니다.

 

by jkson [2017.11.08 18:37:47]
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

 


by 푸릉이 [2017.11.09 17:18:41]

총계 부분 끝에 recvAmt / totAmt 로 나눈 퍼센트도 표시할수 있을까요?


by 마농 [2017.11.08 20:32:38]
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
;

 


by 푸릉이 [2017.11.09 17:18:28]

총계 부분 끝에 recvAmt / totAmt 로 나눈 퍼센트도 표시할수 있을까요?


by 마농 [2017.11.09 18:25:01]
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
;

 


by 푸릉이 [2017.11.12 15:19:46]

고맙습니다. ㅠ 징수율 부분은 아직도 이해가 잘 안 되네요.  샘플에는 없지만 0원 받은것도 있어서

그냥 1로 수정하면 되긴하던데.


by 마농 [2017.11.13 11:08:17]

분모에 0 이 가능하다면? 0을 널로 바꾸어 처리하세요.
 - 변경전 :  a / b
 - 변경후 :  a / NULLIF(b, 0)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입