SELECT food, COUNT(IFNULL(food, 1)) cnt FROM likes GROUP BY food
# result
+------+-------------+
| food | cnt |
+--------------------+
| NULL | 2 |
| 냉삼 | 10 |
| 곱창 | 5 |
+------+-------------+
WITH ROLLUP을 이용하여 GROUP BY 결과에 대한 합계 행을 추가해보자.
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를 이용하여 추가된 행이 합계라는것을 알려주자.
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을 되돌려주자.
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] 진짜 NULL을 COALESCE로 처리해준 결과에
[2] WITH ROLLUP을 이용하여 합계 행을 추가하고
[3] ROLLUP 행에 대해 COALESCE로 최종 '합계' 처리를 해주었는데
복잡하고 더 좋은 방법이 있을것만 같은 느낌..