Database/SQL Server

SQL Server - 월별 max값 찾기, 월별 합계 및 총합계 뽑아내기

청렴결백한 만능 재주꾼 2020. 12. 29. 05:56
반응형

지난 번에는 1년간 판매 기록에서 월별 매출을 뽑을 때 데이터가 없는 월이라도 0으로 데이터가 표시 되게 하는 방법을 했다.

 

오늘은 1년간 판매 기록에서 월별 max값, 판매가 많이 된날을 월별로 정리하는 것( 테이블 액세스는 단 한번해야함)

 

그리고 월별 합계와 함께 내가 보고있는 결과화면의 기간의 총합을 뽑아내보겠다.

 

활용할 테이블 모습

select * from sales_data한 모습. 하루에 일어난 판매량이 1년동안 저장이 되어 있다.

 

 

select convert(varchar(6), sales_date, 112) as YYYYMM,
       substring(
       max(
       right('000000000' + convert(varchar, sales_count), 9) + convert(varchar, sales_date, 112)), 14, 18) '최고 판매된 날짜',
           max(sales_count) '월최고판매량'
  from sales_data
group by convert(varchar(6), sales_date, 112)

------------------------format을 사용

select convert(varchar(6), sales_date, 112) as YYYYMM,
       substring(max(format(sales_count,'D9') + convert(varchar, sales_date, 112)), 14, 18) '최고 판매된 날짜',
           max(sales_count) '월최고판매량'
  from sales_data
group by convert(varchar(6), sales_date, 112)

위에 작성된 statement를 보면 문자열로 변환시켜 모든것을 가공했다. 

그 밑은 그냥 숫자를 바로 format함수를 사용하여 자릿수를 맞추었다. 그리고 group by를 날짜로 하여 묶으니 월별 최고 판매와 그 날짜가 결과로 나오게 된다.

 

 

 

월별 합계 및 총합계 같이 불러오기

select case when cp.num = 1 
        	then x.YYYYMM 
        	else 'TOTAL' 
        end as gc, 
        sum(x.Cnt) as Cnt
  from (
  	select convert(varchar(6), sales_date, 112) as YYYYMM, 
    		sum(sales_count) cnt
          from sales_data
         group by convert(varchar(6), sales_date, 112)) x
inner join copy_t cp on cp.num <= 2
group by case when cp.num = 1 then x.YYYYMM else 'TOTAL' end

결과 화면

위에서 나오는 copy_t은 num이란 컬럼하나로 이루어져 있고 1부터 999까지 숫자만 있는 테이블이다. 필요할 때마다 조인을 하여 결과물을 가공하기 위해 만들어진 테이블이다.  

 

여기서는 inner join을 사용하여 테이블을 2배로 뻥튀기 한다. 그리고 cp.num =1 인 그룹과 cp.num=2인 그룹을 따로 가공한다. 

 

cp.num=1인 그룹은 그냥 월별로 그룹바이를 하고 cp.num=2인 그룹은 total로 별칭을 주고 묶어 버린다. 

반응형