요구사항
- 2020년1월~2021년 현재까지
- 주문상태는 결제완료
- 상점코드별 월단위 판매금액 순 100위까지의 고객의 정보를 추출
- 판매금액이 동일할 경우 같은 등수로 처리
- 추출정보 : 상점코드, 년월, 고객명, 판매금액, 판매수량
환경 : AWS ARORA DB
문제 : RANK() 함수가 지원되지 않아 직접 구현해야 함
SELECT
*
FROM (
SELECT A.*
, CASE @SHOP WHEN SHOP_NO THEN
CASE @MON WHEN MON THEN
IF(@SALE_AMT > SALE_AMT, @RANK := @RANK + 1, @RANK)
ELSE
@RANK := 1
END
ELSE
@RANK := 1
END AS RNK
, @SHOP := SHOP_NO
, @MON := MON
, @SALE_AMT := SALE_AMT
FROM (
SELECT A.상점코드 AS SHOP_NO
, DATE_FORMAT(A.주문일시, '%Y-%m') AS MON
, C.유저명 AS USER_NM
, SUM(A.판매금액) AS SALE_AMT
, SUM(B.판매수량) AS SALE_QTY
FROM 판매테이블 A
JOIN 판매상세테이블 B
ON A.판매번호 = B.판매번호
LEFT OUTER JOIN 유저테이블 C
ON A.유저번호 = C.유저번호
WHERE A.주문상태 = '결제완료'
AND A.주문일시 >= '2020-01-01'
AND A.주문일시 < '2021-12-31'
GROUP BY A.상점코드, DATE_FORMAT(A.주문일시, '%Y-%m'), A.유저번호
) A
CROSS JOIN (SELECT @RANK := 0, @SHOP:=0, @MON:='', @SALE_AMT := 0) B
ORDER BY SHOP_NO, MON, SALE_AMT DESC
) A
WHERE SALE_AMT >0 AND RNK <= 100
MYSQL 8.0 이상부터는 RANK() 함수를 지원하니 그냥 작성하면 됨
'프로그래밍 > DBMS' 카테고리의 다른 글
Mysql 칼렌더 덤프 데이터 만들기 (0) | 2021.02.17 |
---|---|
MSSQL 모든 상위 부서 찾기 프로시저 (0) | 2018.05.07 |
mssql log 파일 축소 (0) | 2018.03.27 |
MSSQL 클러스터드 인덱스 생성 스크립트 (0) | 2018.02.02 |
[MSSQL] Create Table (0) | 2017.10.31 |
[MSSQL] 컬럼 추가 템플릿, Add Column (0) | 2017.10.19 |
MSSQL 테이블 사용하는 프로시저 찾기 (0) | 2017.09.21 |
Oracle 연결시에 BadImageFormatException 32비트 문제 발생 시 (2) | 2016.11.22 |