datetime custID paid_money
20190101 a1 10,000
20190101 a2 10,000
20190102 a2 5,000
이런식으로 일자별, 고객별로 테이블에 값이 있습니다.
해당 테이블에서 1월의 실적은 18년 7월 ~ 18년 12월
2월의 실적은 18년 8월 ~ 19년 1월 이런식으로 하여
매출 5만원 단위로 집계를 하려고 합니다.
이렇게 구하려고 합니다.
어떻게 쿼리를 짜야할까요?
2개의 답변이 있습니다.
DBMS 종류에 따라 사용할 수 있는 함수 등에 차이가 있겠고요.
그리고, 18년 8월은 2019년 1월 실적에도 잡히고, 2019년 2월 실적에도 잡히게 되는 건가요??
조금 이상하긴 하지만...
오라클을 이용해서,
현재달 실적에 이전 6개월 전부터 앞개월까지 누적하는 쿼리를 2019년 1월 실적에 대해서만 만들어 본다면...
var year_month varchar;
exec :year_month := '201901'; -- 누적 실적을 알고 싶은 월을 지정함
select decode (clss, 0, '5만이하', 1, '5만이상', 2, '10만이상', '15만이상') 구분, count (*) 고객수, sum (paid_money) 매출
from (
select round (paid_money/50000) clss, custID, paid_money,
months_between (to_date ( :year_month, 'yyyymm'), to_date (substr (datetime,1,6),'yyyymm')) months
from table명
) a
where where a.months between 1 and 6
group by a.clss
order by a.clss
Test는 해 보지 않아 일부 오류가 있을 수는 있습니다.
여러 월에 대한 실적으로 옆으로 쭉~ 붙여 나오게 하려면 쿼리가 많이 복잡해 질것 같고요.
각 월에 대한 실적을 산출해서 Excel 등을 이용해서 정리해 주는게 오히려 간편할 거라 보여 지네요.
wansoo | 약 4년 전
select left(datetime, 6) as '년월'
, count(*) as '전체고객수'
, sum(paid_money) as '전체매출'
, sum(case when paid_money >= 100000 then 1 else 0 end) as up10c
, sum(case when paid_money < 100000 and paid_money >= 50000 then 1 else 0 end) as up5c
, sum(case when paid_money < 50000 then 1 else 0 end) as down5c
, sum(case when paid_money >= 100000 then paid_money else 0 end) as up10p
, sum(case when paid_money < 100000 and paid_money >= 50000 then paid_money else 0 end) as up5p
, sum(case when paid_money < 50000 then paid_money else 0 end) as down5p
from 테이블
group by left(datetime, 6)
=========================
저 쿼리를 서브쿼리로 하셔서 한번더 작업해서 원하는 양식으로 뽑으셔되 되고...
아니면 엑셀에서 수작업으로 정리한번 해주셔도 됩니다.