안녕하세요. 프로젝트를 진행하다가 궁금한것이 있어 글을 남깁니다.
다른게 아니라 매출 sum 하는 쿼리입니다.
먼저 설명보다는 데이터를 가지고 설명을 하겠습니다.
데이터는 아래와 같이 있습니다.
ID | amount(매출) |date(날짜) |price(공급가액) |start_dt(계약시작일자) |end_dt(계약종료일자)
AAA |3333.3333 |20180828 |300,000 |20180828 |20181125
AAA |3333.3333 |20180829 |300,000 |20180828 |20181125
AAA |3333.3333 |20180830 |300,000 |20180828 |20181125
AAA |3333.3333 |20180831 |300,000 |20180828 |20181125
AAA |3333.3333 |20180901 |300,000 |20180828 |20181125
AAA |3333.3333 |20180902 |300,000 |20180828 |20181125
.
.
.
AAA |3333.3333 |20181124 |300,000 |20180828 |20181125
AAA |3333.3333 |20181125 |300,000 |20180828 |20181125
이렇게 있습니다.
이 데이터를 월별로 sum을 하면
ID | amount(매출) |date(날짜) |price(공급가액) |start_dt(계약시작일자) |end_dt(계약종료일자)
AAA |13,333 |201808 |300,000 |20180828 |20181125
AAA |100,000 |201809 |300,000 |20180828 |20181125
AAA |103,333 |201810 |300,000 |20180828 |20181125
AAA |83,333 |201811 |300,000 |20180828 |20181125
이렇게 나옵니다.
공급가액은 300,000원이고, 원본 data에 내용을 기반으로 amount를 전체 sum 하면 300,000원이 나옵니다.
하지만 월별로 group by로 정렬했을때의 값은 299,999원이 나옵니다.
이럴때 값을 맞춰 줘야합니다.
기존)
ID | amount(매출) |date(날짜) |price(공급가액) |start_dt(계약시작일자) |end_dt(계약종료일자)
AAA |83,333 |201811 |300,000 |20180828 |20181125
변경)
ID | amount(매출) |date(날짜) |price(공급가액) |start_dt(계약시작일자) |end_dt(계약종료일자)
AAA |83,334 |201811 |300,000 |20180828 |20181125
머리로 생각했을때, 월별로 나온 amount(매출)와(과) price(공급가액)를(을) 비교했을때, price(공급가액) 보다 작으면 1을 더해야 한다.
하지만 쿼리로 작성하기에는 어렵더라구요...
어떻게 해야 할까요??
WITH t AS ( SELECT 'AAA' id, 13333.3332 amount, '20180828' date, 300000 price, '20180828' lstart_dt, '20181125' lend_dt UNION ALL SELECT 'AAA', 99999.9990, '20180930', 300000, '20180828', '20181125' UNION ALL SELECT 'AAA', 103333.3323, '20181031', 300000, '20180828', '20181125' UNION ALL SELECT 'AAA', 83333.3325, '20181125', 300000, '20180828', '20181125' ) SELECT id , LEFT(date, 6) ym , ROUND(SUM(amount), 0) amount_old , ROUND(SUM(amount), 0) + CASE WHEN ROW_NUMBER() OVER(PARTITION BY id ORDER BY LEFT(date, 6) DESC) = 1 THEN price - SUM(ROUND(SUM(amount), 0)) OVER(PARTITION BY id) ELSE 0 END AS amount_new , price , lstart_dt , lend_dt FROM t GROUP BY id, price, lstart_dt, lend_dt, LEFT(date, 6) ORDER BY id, ym ;