-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathSQLZOO_Neeps_Answers.sql
More file actions
269 lines (255 loc) · 5.04 KB
/
SQLZOO_Neeps_Answers.sql
File metadata and controls
269 lines (255 loc) · 5.04 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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
/*
SQLZOO Guest House Answers
Questions available at http://sqlzoo.net/wiki/Neeps
*/
-- #1
/*
Give the room id in which the event co42010.L01 takes place.
*/
SELECT
event.room
FROM
event
WHERE
event.id = 'co42010.L01';
-- #2
/*
For each event in module co72010 show the day, the time and the place.
*/
SELECT
event.dow,
event.tod,
event.room
FROM
event
WHERE
event.modle = 'co72010';
-- #3
/*
List the names of the staff who teach on module co72010.
*/
SELECT DISTINCT
staff.name
FROM
staff
JOIN
teaches
ON staff.id = teaches.staff
JOIN
event
ON teaches.event = event.id
WHERE
event.modle = 'co72010';
-- #4
/*
Give a list of the staff and module number associated with events using room cr.132 on Wednesday, include the time each event starts.
*/
SELECT
staff.name,
event.modle,
event.tod
FROM
staff
JOIN
teaches
ON staff.id = teaches.staff
JOIN
event
ON teaches.event = event.id
WHERE
event.room = 'cr.132'
AND event.dow = 'Wednesday';
-- #5
/*
Give a list of the student groups which take modules with the word 'Database' in the name.
*/
SELECT
student.name
FROM
student
JOIN
attends
ON student.id = attends.student
JOIN
event
ON attends.event = event.id
JOIN
modle
ON event.modle = modle.id
WHERE
LOWER(modle.name) LIKE LOWER('%database%');
-- #6
/*
Show the 'size' of each of the co72010 events. Size is the total number of students attending each event.
*/
SELECT
event.id,
SUM(student.sze)
FROM
student
JOIN
attends
ON student.id = attends.student
JOIN
event
ON attends.event = event.id
WHERE
event.modle = 'co72010'
GROUP BY
event.id;
-- #7
/*
For each post-graduate module, show the size of the teaching team. (post graduate modules start with the code co7).
*/
SELECT
COUNT(DISTINCT staff.id),
event.modle
FROM
staff
JOIN
teaches
ON staff.id = teaches.staff
JOIN
event
ON teaches.event = event.id
WHERE
event.modle LIKE 'co7%'
GROUP BY
event.modle;
-- #8
/*
Give the full name of those modules which include events taught for fewer than 10 weeks.
*/
SELECT DISTINCT
modle.name
FROM
modle
JOIN
event
ON event.modle = modle.id
JOIN
occurs
ON event.id = occurs.event
GROUP BY
event.id, modle.name
HAVING
COUNT(occurs.week) < 10;
-- #9
/*
Identify those events which start at the same time as one of the co72010 lectures.
*/
SELECT
event.id
FROM
event
WHERE
CONCAT(event.dow, event.tod) IN
(
SELECT
CONCAT(event.dow, event.tod)
FROM
event
WHERE
event.modle = 'co72010'
);
-- #10
/*
How many members of staff have contact time which is greater than the average?
*/
SELECT
COUNT(*) AS 'Number of staff with greater than average contact time'
FROM
(
SELECT
staff.id,
SUM(event.duration)
FROM
staff
JOIN
teaches
ON staff.id = teaches.staff
JOIN
event
ON teaches.event = event.id
GROUP BY
staff.id
HAVING
SUM(event.duration) > (
SELECT
SUM(t.hours)/COUNT(t.hours)
FROM
(
SELECT
SUM(event.duration) AS hours
FROM
staff
JOIN
teaches
ON staff.id = teaches.staff
JOIN
event
ON teaches.event = event.id
GROUP BY
staff.id
) AS t
)
) AS a
-- #11
/*
co.CHt is to be given all the teaching that co.ACg currently does. Identify those events which will clash.
*/
SELECT DISTINCT
a.id, b.id
FROM
(
SELECT
event.id,
event.tod AS time_begin,
event.tod + event.duration AS time_end,
event.dow,
occurs.week
FROM
event
JOIN
teaches
ON event.id = teaches.event
JOIN
staff
ON teaches.staff = staff.id
JOIN occurs
ON event.id = occurs.event
WHERE
staff.id = 'co.CHt'
) AS a
CROSS JOIN
(
SELECT
event.id,
event.tod AS time_begin,
event.tod + event.duration AS time_end,
event.dow,
occurs.week
FROM
event
JOIN
teaches
ON event.id = teaches.event
JOIN
staff
ON teaches.staff = staff.id
JOIN occurs
ON event.id = occurs.event
WHERE
staff.id = 'co.ACg'
) AS b
WHERE
a.dow = b.dow
AND (a.time_begin >= b.time_begin AND a.time_begin < b.time_end)
OR (b.time_begin >= a.time_begin AND b.time_begin < a.time_end)
AND a.week = b.week
AND a.id > b.id;
-- #12
/*
Produce a table showing the utilisation rate and the occupancy level for all rooms with a capacity more than 60
NOTE: Cannot answer this one as room table seems to be prioritized by another room table in a different database.
*/