-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlesson13.sql
More file actions
141 lines (115 loc) · 3.36 KB
/
Copy pathlesson13.sql
File metadata and controls
141 lines (115 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
Lesson 13: Grouping and Aggregates
Written on: December 29, 2024
*/
USE TrackIt;
SHOW TABLES;
-- Listing 13.1: Using an Aggregate Function to Count
USE TrackIt;
-- Count TaskIds, 543 values
SELECT COUNT(TaskId)
FROM Task;
-- Count everything, 543 values
SELECT COUNT(*)
FROM Task;
-- Listing 13.2: Counting TaskStatusId
SELECT COUNT(TaskStatusId) -- 532 values
FROM Task;
-- Listing 13.3: Counting Resolved Tasks
SELECT
COUNT(t.TaskId)
FROM Task t
INNER JOIN TaskStatus s ON t.TaskStatusId = s.TaskStatusId
WHERE s.IsResolved = 1;
-- Listing 13.4: Counting Tasks per Status
SELECT
IFNULL(s.Name, '[None]') StatusName,
COUNT(t.TaskId) TaskCount
FROM Task t
LEFT OUTER JOIN TaskStatus s ON t.TaskStatusId = s.TaskStatusId
GROUP BY s.Name
ORDER BY s.Name;
-- Listing 13.5: Dropping Group by
SELECT
IFNULL(s.Name, '[None]') StatusName,
COUNT(t.TaskId) TaskCount
FROM Task t
LEFT OUTER JOIN TaskStatus s ON t.TaskStatusId = s.TaskStatusId
ORDER BY s.Name;
-- Listing 13.6: Adding IsResolved
-- This script should not work.
SELECT
IFNULL(s.Name, '[None]') StatusName,
s.IsResolved,
COUNT(t.TaskId) TaskCount
FROM Task t
LEFT OUTER JOIN TaskStatus s ON t.TaskStatusId = s.TaskStatusId
GROUP BY s.Name
ORDER BY s.Name;
-- Listing 13.7: Adding TaskStatus.IsResolved to the Groupings
SELECT
IFNULL(s.Name, '[None]') StatusName,
IFNULL(s.IsResolved, 0) IsResolved,
COUNT(t.TaskId) TaskCount
FROM Task t
LEFT OUTER JOIN TaskStatus s ON t.TaskStatusId = s.TaskStatusId
GROUP BY s.Name, s.IsResolved -- IsResolved is now part of the GROUP.
ORDER BY s.Name;
-- Listing 13.8: Getting a List of Distinct Project Names
SELECT DISTINCT
p.Name ProjectName,
p.ProjectId
FROM Project p
INNER JOIN Task t ON p.ProjectId = t.ProjectId
ORDER BY p.Name;
-- Listing 13.9: Getting Unique Project Names Using GROUP BY
SELECT
p.Name ProjectName,
p.ProjectId
FROM Project p
INNER JOIN Task t ON p.ProjectId = t.ProjectId
GROUP BY p.Name, p.ProjectId
ORDER BY p.Name;
-- Listing 13.10: First Draft of Filteriing
SELECT
CONCAT(w.FirstName, ' ', w.LastName) WorkerName,
SUM(t.EstimatedHours) TotalHours
FROM Worker w
INNER JOIN ProjectWorker pw ON w.WorkerId = pw.WorkerId
INNER JOIN Task t ON pw.WorkerId = t.WorkerId
AND pw.ProjectId = t.ProjectId
GROUP BY w.WorkerId, w.FirstName, w.LastName;
-- Listing 13.11: Adding HAVING
SELECT
CONCAT(w.FirstName, ' ', w.LastName) WorkerName,
SUM(t.EstimatedHours) TotalHours
FROM Worker w
INNER JOIN ProjectWorker pw ON w.WorkerId = pw.WorkerId
INNER JOIN Task t ON pw.WorkerId = t.WorkerId
AND pw.ProjectId = t.ProjectId
GROUP BY w.WorkerId, w.FirstName, w.LastName
HAVING SUM(t.EstimatedHours) >= 100;
-- Listing 13.12: Query for Tasks Minimum Due Dates
SELECT
p.Name ProjectName,
MIN(t.DueDate) MinTaskDueDate
FROM Project p
INNER JOIN Task t ON p.ProjectId = t.ProjectId
WHERE p.ProjectId LIKE 'game-%'
AND t.ParentTaskId IS NOT NULL
GROUP BY p.ProjectId, p.Name
ORDER BY p.Name;
-- Listing 13.13: An Overview of Each Project with 10 or More Tasks
SELECT
p.Name ProjectName,
MIN(t.DueDate) MinTaskDueDate,
MAX(t.DueDate) MaxTaskDueDate,
SUM(t.EstimatedHours) TotalHours,
AVG(t.EstimatedHours) AverageTaskHours,
COUNT(t.TaskId) TaskCount
FROM Project p
INNER JOIN Task t ON p.ProjectId = t.ProjectId
WHERE t.ParentTaskId IS NOT NULL
GROUP BY p.ProjectId, p.Name
HAVING COUNT(t.TaskId) >= 10
ORDER BY COUNT(t.TaskId) DESC, p.Name;