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