프로그래밍/DBMS
MYSQL 그룹별 RANK함수 구현하기
zoo10
2021. 3. 16. 15:51

요구사항
- 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() 함수를 지원하니 그냥 작성하면 됨