mssql 월별 매출 쿼리 질문 0 1 1,976

by 힘내라김대리 [SQL Query] 월별매출쿼리 mssql mssql매출쿼리 [2018.12.11 10:34:22]


안녕하세요. 프로젝트를 진행하다가 궁금한것이 있어 글을 남깁니다.

 

다른게 아니라 매출 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을 더해야 한다.

 

하지만 쿼리로 작성하기에는 어렵더라구요...

 

어떻게 해야 할까요?? 

by 마농 [2018.12.11 11:32:13]
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
;

 

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