저번에 올린 피봇하는 방법은 결과값을 다 구한 다음 행과열을 한줄씩 바꾼 후 UNION을 하는 방법이였습니다.
이렇게 하니 쿼리가 너무 길어지고 비효율적으로 생각이 되었습니다.
그래서 오늘은 매장별, 날짜별 판매를 구한 다음 매장별로 묶어 더해주는 방법을 사용하겠습니다.
먼저, 10월21일부터 10월27일까지 판매가 되었으면 1로 출력해주도록 하였습니다.
SELECT
BRANCH,
CASE WHEN ORDER_DT = '2021-10-21' THEN 1 ELSE 0 END AS '21일',
CASE WHEN ORDER_DT = '2021-10-22' THEN 1 ELSE 0 END AS '22일',
CASE WHEN ORDER_DT = '2021-10-23' THEN 1 ELSE 0 END AS '23일',
CASE WHEN ORDER_DT = '2021-10-24' THEN 1 ELSE 0 END AS '24일',
CASE WHEN ORDER_DT = '2021-10-25' THEN 1 ELSE 0 END AS '25일',
CASE WHEN ORDER_DT = '2021-10-26' THEN 1 ELSE 0 END AS '26일',
CASE WHEN ORDER_DT = '2021-10-27' THEN 1 ELSE 0 END AS '27일'
FROM
TB_ORDER
WHERE
DATE_FORMAT(ORDER_DT, '%Y-%m-%d') BETWEEN '2021-10-21' AND '2021-10-27'
실행결과는
이렇게 날짜에 판매가 된적이 있으면 1, 없으면 0으로 출력이 됩니다.
이제 매장별 날짜별 판매 수를 구하기 위해 위에 결과에서 매장별로 값을 더해주겠습니다.
SELECT
CASE WHEN BRANCH IS NULL THEN '총합' ELSE BRANCH END AS '가맹점',
SUM(21일) AS '2021-10-21',
SUM(22일) AS '2021-10-22',
SUM(23일) AS '2021-10-23',
SUM(24일) AS '2021-10-24',
SUM(25일) AS '2021-10-25',
SUM(26일) AS '2021-10-26',
SUM(27일) AS '2021-10-27',
SUM(21일) + SUM(22일) + SUM(23일) + SUM(24일) + SUM(25일) + SUM(26일) + SUM(27일) AS '합계'
FROM
(
SELECT
BRANCH,
CASE WHEN ORDER_DT = '2021-10-21' THEN 1 ELSE 0 END AS '21일',
CASE WHEN ORDER_DT = '2021-10-22' THEN 1 ELSE 0 END AS '22일',
CASE WHEN ORDER_DT = '2021-10-23' THEN 1 ELSE 0 END AS '23일',
CASE WHEN ORDER_DT = '2021-10-24' THEN 1 ELSE 0 END AS '24일',
CASE WHEN ORDER_DT = '2021-10-25' THEN 1 ELSE 0 END AS '25일',
CASE WHEN ORDER_DT = '2021-10-26' THEN 1 ELSE 0 END AS '26일',
CASE WHEN ORDER_DT = '2021-10-27' THEN 1 ELSE 0 END AS '27일'
FROM
TB_ORDER
WHERE
DATE_FORMAT(ORDER_DT, '%Y-%m-%d') BETWEEN '2021-10-21' AND '2021-10-27'
)TMP
GROUP BY TMP.BRANCH WITH ROLLUP
GROUP BY를 사용하여 매장별로 더하였습니다.
그리고 WITH ROLLUP을 사용하여 날짜별 합계도 구해주었습니다.
실행하면 결과는 이렇게 나옵니다.
저번과 결과는 똑같지만 쿼리가 훨씬 짧고 효율적으로 구할 수 있습니다.
[MariaDB] 피봇(pivot) 사용하기 (2) | 2021.12.19 |
---|