[Mariadb] WITH ROLLUP을 이용한 합계 나타내기 (feat.NULL)

가비·2021년 9월 17일
0

[MariaDB]

목록 보기
3/3
SELECT food, COUNT(IFNULL(food, 1)) cnt FROM likes GROUP BY food

# result
+------+-------------+
| food |         cnt |
+--------------------+
| NULL |           2 |
|  냉삼 |          10 |
|  곱창 |           5 |
+------+-------------+

WITH ROLLUP을 이용하여 GROUP BY 결과에 대한 합계 행을 추가해보자.

일단 ROLLUP

SELECT food, COUNT(IFNULL(food, 1)) cnt FROM likes GROUP BY food WITH ROLLUP

+------+-------------+
| food |         cnt |
+--------------------+
| NULL |           2 |
|  냉삼 |          10 |
|  곱창 |           5 |
| NULL |          17 |  👈
+------+-------------+

위와 같이 WITH ROLLUP을 이용하면 합계 행이 추가되었으나 GROUP BY 기준이되는 열의 값은 NULL로 표시된다.

COALESCE를 이용하여 추가된 행이 합계라는것을 알려주자.

보기좋게 ROLLUP

SELECT COALESCE(food, '합계') food, COUNT(IFNULL(food, 1)) cnt
FROM likes
GROUP BY food WITH ROLLUP


+------+-------------+
| food |         cnt |
+--------------------+
|  합계 |           2 |  👈
|  냉삼 |          10 |
|  곱창 |           5 |
|  합계 |          17 |
+------+-------------+

????????

COALESCE는 NULL값을 지정된 기본값으로 대체하는 함수로 진짜 NULL까지 지정된 '합계'로 대체되어 버렸다.

진짜 NULL을 되돌려주자.

정확하게 ROLLUP

SELECT
    COALESCE(t.coalesce_food, 'Total') AS food,           👈 [3]
    COUNT(IFNULL(t.food, 1)) AS cnt
FROM
(
    SELECT COALESCE(food, 'NULL') AS coalesce_food, food  👈 [1]
    FROM likes
) t
GROUP BY t.coalesce_food WITH ROLLUP                      👈 [2]

# 짜란✨
+------+-------------+
| food |         cnt |
+--------------------+
|  냉삼 |          10 |
|  곱창 |           5 |
| NULL |           2 |
|  합계 |          17 |
+------+-------------+

[1] 진짜 NULLCOALESCE로 처리해준 결과에 
[2] WITH ROLLUP을 이용하여 합계 행을 추가하고 
[3] ROLLUP 행에 대해 COALESCE로 최종 '합계' 처리를 해주었는데 

복잡하고 더 좋은 방법이 있을것만 같은 느낌..

IFNULL과 COALESCE의 차이점이 궁금하다면 👇

COALESCE vs IFNULL

0개의 댓글