1+ /* ******* 1) GROUP BY **********/
2+ /*
3+ When we group by, we apply the function PER GROUP, NOT on the ENTIRE DATA SET.
4+ Group by use Split, Apply, Combine strategry.
5+ */
6+
7+ /* How many employees worked in each department ? */
8+ SELECT d .dept_name AS " Department Name" ,COUNT (e .emp_no ) AS " Number Of Employee"
9+ FROM employees e
10+ JOIN dept_emp de ON e .emp_no = de .emp_no
11+ JOIN departments d ON d .dept_no = de .dept_no
12+ GROUP BY d .dept_no
13+ ORDER BY 1 ;
14+
15+
16+ /* *********** 2) HAVING Keyword *************/
17+ /*
18+ "Having" applies filters to a group as a whole
19+
20+ **** Order of Operations ****
21+ FROM
22+ WHERE
23+ GROUP BY
24+ HAVING
25+ SELECT
26+ ORDER
27+ */
28+
29+ /* How many employees worked in each department, but with employees more than 25000 ? */
30+ SELECT d .dept_name AS " Department Name" ,COUNT (e .emp_no ) AS " Number Of Employee"
31+ FROM employees e
32+ JOIN dept_emp de ON e .emp_no = de .emp_no
33+ JOIN departments d ON d .dept_no = de .dept_no
34+ GROUP BY d .dept_name
35+ HAVING COUNT (e .emp_no ) > 25000
36+ ORDER BY 1 ;
37+
38+ /* How many Female employees worked in each department, but with employees more than 25000 ? */
39+ SELECT d .dept_name AS " Department Name" ,COUNT (e .emp_no ) AS " Number Of Employee"
40+ FROM employees e
41+ JOIN dept_emp de ON e .emp_no = de .emp_no
42+ JOIN departments d ON d .dept_no = de .dept_no
43+ WHERE e .gender = ' F'
44+ GROUP BY d .dept_name
45+ HAVING COUNT (e .emp_no ) > 25000
46+ ORDER BY 1 ;
47+
48+
49+ /* ********* 3) Ordering Group Data **********/
50+ SELECT d .dept_name AS " Department Name" ,COUNT (e .emp_no ) AS " Number Of Employee"
51+ FROM employees e
52+ JOIN dept_emp de ON e .emp_no = de .emp_no
53+ JOIN departments d ON d .dept_no = de .dept_no
54+ GROUP BY d .dept_name
55+ HAVING COUNT (e .emp_no ) > 25000
56+ ORDER BY 2 DESC ;
57+
58+
59+ /* ******** 4) Group by Mental Model ***********/
60+ /* What are the 8 employees who got the most salary bumps? */
61+ -- SELECT e.emp_no, CONCAT(e.first_name, e.last_name) AS "Name", s.salary, s.from_date, s.to_date
62+ SELECT emp_no, MAX (from_date)
63+ FROM salaries
64+ GROUP BY emp_no;
65+
66+ /* ********** 5) GROUPING SETS**********/
67+
68+ /* ****** UNION / UNION ALL *********/
69+ /*
70+ SELECT col1, SUM(col2)
71+ FROM table
72+ GROUP BY col1
73+
74+ UNION / UNION ALL
75+
76+ SELECT SUM(col2)
77+ FROM table
78+
79+
80+ UNION ALL doesn't remove DUPLICATE Records.
81+ */
82+ SELECT NULL AS " prod_id" , sum (ol .quantity )
83+ FROM orderlines AS ol
84+ UNION
85+ SELECT prod_id AS " prod_id" , sum (ol .quantity )
86+ FROM orderlines AS ol
87+ GROUP BY prod_id
88+ ORDER BY prod_id DESC ;
89+
90+ /* ********** GROUPING SETS ***********/
91+ /*
92+ A Subclause of GROUP BY that allows you to define multiple grouping
93+ It is very useful when we want to combine multiple grouping
94+ */
95+
96+ -- same result as using above UNION code
97+ SELECT NULL AS " prod_id" , sum (ol .quantity )
98+ FROM orderlines AS ol
99+ GROUP BY
100+ GROUPING SETS(
101+ (),
102+ (prod_id)
103+ )
104+ ORDER BY prod_id DESC ;
105+
106+ /* we can add in multiple groups as we need */
107+ SELECT NULL AS " prod_id" , orderlineid, sum (ol .quantity )
108+ FROM orderlines AS ol
109+ GROUP BY
110+ GROUPING SETS(
111+ (),
112+ (prod_id),
113+ (orderlineid)
114+ )
115+ ORDER BY prod_id DESC , orderlineid DESC ;
0 commit comments