반응형
지난 번에는 1년간 판매 기록에서 월별 매출을 뽑을 때 데이터가 없는 월이라도 0으로 데이터가 표시 되게 하는 방법을 했다.
오늘은 1년간 판매 기록에서 월별 max값, 판매가 많이 된날을 월별로 정리하는 것( 테이블 액세스는 단 한번해야함)
그리고 월별 합계와 함께 내가 보고있는 결과화면의 기간의 총합을 뽑아내보겠다.
활용할 테이블 모습
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로 별칭을 주고 묶어 버린다.
반응형
'Database > SQL Server' 카테고리의 다른 글
SQL Server - 달력 만들기 (0) | 2021.01.08 |
---|---|
SQL Server - 여러 행을 한 행에 담아 정리하기 (0) | 2020.12.30 |
SQL Server - 자릿수 맞추기, 000 집어넣기 (0) | 2020.12.29 |
SQL Server - 동적 SQL Dynamic SQL (0) | 2020.12.23 |
SQL Server - 전역 고유 식별자 GUID Globally Unique Identifier (0) | 2020.12.23 |