[SQL 예문] 브랜드별 매출 국가 순위 TOP 10 (ft. 서브쿼리, Round_number() Over () )
브랜드별, 어느 국가에서 잘 팔리는지 매출 순으로 상위 국가 10개씩 추출하기
아래와 표와 같은 형식으로 데이터를 뽑아보자
JOIN 2번 하고
서브쿼리 쓰고
ROW_NUMBER() OVER (PARTITION BY _ ORDER BY _) 함수를 사용했다.
SELECT
it_brand
,od_b_country
,od_price
FROM
(
SELECT
it.it_brand
,od.od_b_country
,TO_CHAR (SUM(ct.ct_qty) , '999,999,999') AS "od_qty"
,TO_CHAR (SUM(ct.ct_price * ct.ct_qty), '999,999,999.99' ) AS "od_price"
,ROW_NUMBER() OVER (PARTITION BY it_brand ORDER BY od_price DESC) as o_rn
FROM shop_order AS od JOIN shop_cart AS ct
ON od.od_id=ct.od_id
LEFT JOIN shop_item AS it
ON ct.s2_product_code=it.s2_product_code
WHERE it.it_brand != ''
AND left(od.od_receipt_time, 10) BETWEEN '2022-01-01' AND '2022-02-28' -- 결제일시
AND ct.ct_status IN ('완료','입금','배송','준비')
GROUP BY it.it_brand, od.od_b_country
) as subquery1
WHERE o_rn < 11
AND it_brand in('nice','adddis','nature') -- 원하는 브랜드 입력
우선 subquery1 의 결과는 아래와 같다
브랜드별, 국가별, 판매 수량, 판매금액, o_rn
ROW_NUMBER() OVER () 함수의 결과로 o_rn 이 생겼다.
이렇게 생성된 subquery1 테이블에서 아래와 같이 SELECT를 하면 최종 결과가 나온다.
SELECT
it_brand, od_b_country, od_price
FROM subquery1
WHERE o_rn < 11
AND it_brand in (' ' , ' ', ' ' , ' '...)
브랜드별 매출 국가 순위 TOP 10 을 볼때는 아래와 같이
WHERE o_rn < 11 이렇게 조건을 줘서
o_rn 이 1부터 10 까지 인 컬럼만 골랐는데
브랜드별 매출 국가 순위 TOP 5 를 보고 싶다면
아래와 같이 o_rn 을 수정해 주면 된다.
SELECT
it_brand, od_b_country, od_price
FROM subquery2
WHERE o_rn < 6
AND it_brand in (' ' , ' ', ' ' , ' '...)
*참고 : 이 글은 AWS Redshift PL/pgSQL 사용한 쿼리문 입니다