11.4.8 GROUP BY

11.4.8.1 WITH ROULLUP

-- GROUP BY의 전체 합계 조회
SELECT dept_no, COUNT(*)
FROM dept_emp
GROUP BY dept_no WITH ROLLUP;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d001    |    20211 |
| d002    |    17346 |
| d003    |    17786 |
| d004    |    73485 |
| d005    |    85707 |
| d006    |    20117 |
| d007    |    52245 |
| d008    |    21126 |
| d009    |    23580 |
| NULL    |   331603 |
+---------+----------+

-- GROUP BY 칼럼 2개
-- first_name 그룹별로 소계 레코드 출력
-- 마지막 라인에 전체 총계 레코드 출력
SELECT first_name, last_name, COUNT(*)
FROM employees 
GROUP BY first_name, last_name WITH ROLLUP;
+----------------+------------------+----------+
|   first_name   |    last_name     | count(*) |
+----------------+------------------+----------+
...
| Zhonghua       | Zwicker          |        1 |
| Zhonghua       | NULL             |      203 |
...
| Zissis         | Zeleznik         |        1 |
| Zissis         | NULL             |      241 |
...
| Zvonko         | Zuberek          |        1 |
| Zvonko         | NULL             |      258 |
| NULL           | NULL             |   300024 |
+----------------+------------------+----------+
SELECT IF(GROUPING(dept_no), 'Total', dept_no) AS dept_no, COUNT(*)
FROM dept_emp
GROUP BY dept_no WITH ROLLUP;
+---------+----------+
| dept_no | COUNT(*) |
+---------+----------+
| d001    |    20211 |
| d002    |    17346 |
...
| d008    |    21126 |
| d009    |    23580 |
| Total   |   331603 |
+---------+----------+

11.4.8.2 레코드를 칼럼으로 변환해서 조회

-- 부서번호, 부서별 사원 수
mysql> select dept_no, count(*) as emp_count 
         from dept_emp 
        group by dept_no;
+---------+-----------+
| dept_no | emp_count |
+---------+-----------+
| d001    |     20211 |
| d002    |     17346 |
| d003    |     17786 |
| d004    |     73485 |
| d005    |     85707 |
| d006    |     20117 |
| d007    |     52245 |
| d008    |     21126 |
| d009    |     23580 |
+---------+-----------+

-- 레코드를 칼럼으로 변환
SELECT  
     SUM(CASE WHEN dept_no='d001' THEN emp_count ELSE 0 END) AS count_d001,
     SUM(CASE WHEN dept_no='d002' THEN emp_count ELSE 0 END) AS count_d002,
	...
     SUM(CASE WHEN dept_no='d008' THEN emp_count ELSE 0 END) AS count_d008,
     SUM(CASE WHEN dept_no='d009' THEN emp_count ELSE 0 END) AS count_d009,
     SUM(emp_count) AS count_total
  FROM (
        SELECT dept_no, count(*) AS emp_count FROM dept_emp GROUP BY dept_no
       ) tb_derived;
+------------+------------+------------+-----+------------+-------------+
| count_d001 | count_d002 | count_d003 | ... | count_d009 | count_total |
+------------+------------+------------+-----+------------+-------------+
|      20211 |      17346 |      17786 | ... |      23580 |      331603 |
+------------+------------+------------+-----+------------+-------------+

-- 하나의 칼럼을 여러 칼럼으로 분리
-- employees > hire_date 이용하여 입사 연도별 사원 수 조회 가능
SELECT de.dept_no,
     SUM(CASE WHEN e.hire_date between '1980-01-01' and '1989-12-31' THEN 1 ELSE 0 END) AS cnt_1980,
     SUM(CASE WHEN e.hire_date between '1990-01-01' and '1999-12-31' THEN 1 ELSE 0 END) AS cnt_1990,
     SUM(CASE WHEN e.hire_date between '2000-01-01' and '2009-12-31' THEN 1 ELSE 0 END) AS cnt_2000,
     COUNT(*) AS cnt_total
FROM dept_emp de, employees e
WHERE e.emp_no = de.emp_no
GROUP BY de.dept_no;
+---------+----------+----------+----------+-----------+
| dept_no | cnt_1980 | cnt_1990 | cnt_2000 | cnt_total |
+---------+----------+----------+----------+-----------+
| d001    |    11038 |     9171 |        2 |     20211 |
| d002    |     9580 |     7765 |        1 |     17346 |
| d003    |     9714 |     8068 |        4 |     17786 |
| d004    |    40418 |    33065 |        2 |     73485 |
| d005    |    47007 |    38696 |        3 |     85707 |
| d006    |    11057 |     9059 |        1 |     20117 |
| d007    |    28673 |    23570 |        1 |     52245 |
| d008    |    11601 |     9523 |        0 |     21126 |
| d009    |    12979 |    10600 |        1 |     23580 |
+---------+----------+----------+----------+-----------+

11.4.9 ORDER BY

11.4.9.1 ORDER BY 사용법 및 주의사항~