-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3-1.sql
More file actions
301 lines (269 loc) · 8.29 KB
/
3-1.sql
File metadata and controls
301 lines (269 loc) · 8.29 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
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
USE Northwind
-- I. --------------------------------------------------
-- 1. Dla każdego zamówienia podaj łączną liczbę zamówionych jednostek towaru oraz nazwę klienta.
SELECT
o.OrderID
,c.CompanyName
,SUM(od.Quantity) AS Quantity
FROM
Orders AS o
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
JOIN Customers AS c
ON o.CustomerID = c.CustomerID
GROUP BY o.OrderID, c.CompanyName
-- 2. Dla każdego zamówienia podaj łączną wartość zamówionych produktów (wartość zamówienia bez opłaty za przesyłkę) oraz nazwę klienta.
SELECT
o.OrderId
,CONVERT(
MONEY
,SUM(od.UnitPrice * od.Quantity * (1 - od.Discount))
) AS TotalValue
FROM
Orders AS o
LEFT JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
GROUP BY o.OrderId
-- 3. Dla każdego zamówienia podaj łączną wartość tego zamówienia (wartość zamówienia wraz z opłatą za przesyłkę) oraz nazwę klienta. . Zmodyfikuj poprzednie przykłady tak żeby dodać jeszcze imię i nazwisko pracownika obsługującego zamówień
SELECT
o.OrderId
,e.FirstName
,e.LastName
,CONVERT(
MONEY
,SUM(od.UnitPrice * od.Quantity * (1 - od.Discount) + o.Freight)
) AS TotalValue
FROM
Orders AS o
LEFT JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
LEFT JOIN Employees AS e
ON o.EmployeeID = e.EmployeeID
GROUP BY o.OrderID, e.FirstName ,e.LastName
-- II. --------------------------------------------------
-- 1. Podaj nazwy przewoźników, którzy w marcu 1998 przewozili produkty z kategorii 'Meat/Poultry'
SELECT
DISTINCT
s.CompanyName
FROM
Shippers AS s
INNER JOIN Orders AS o
ON s.ShipperID = o.ShipVia
AND YEAR(o.OrderDate) = 1998
AND MONTH(o.OrderDate) = 3
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
JOIN Products AS p
ON od.ProductID = p.ProductID
INNER JOIN Categories AS c
ON p.CategoryID = c.CategoryID
AND c.CategoryName = 'Meat/Poultry'
-- 2. Podaj nazwy przewoźników, którzy w marcu 1997r nie przewozili produktów z kategorii 'Meat/Poultry'
SELECT
s1.CompanyName
FROM
Shippers AS s
INNER JOIN Orders AS o
ON s.ShipperID = o.ShipVia
AND YEAR(o.OrderDate) = 1997
AND MONTH(o.OrderDate) = 3
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
JOIN Products AS p
ON od.ProductID = p.ProductID
JOIN Categories AS c
ON p.CategoryID = c.CategoryID
AND c.CategoryName = 'Meat/Poultry'
RIGHT JOIN Shippers AS s1
ON s.ShipperID = s1.ShipperID
WHERE s.ShipperID IS NULL
-- 3. Dla każdego przewoźnika podaj wartość produktów z kategorii 'Meat/Poultry' które ten przewoźnik przewiózł w marcu 1997
SELECT
s.CompanyName
,CONVERT(
MONEY
,SUM(od.UnitPrice * od.Quantity *(1 - od.Discount))
) AS TotalValue
FROM
Shippers AS s
INNER JOIN Orders AS o
ON s.ShipperID = o.ShipVia
AND YEAR(o.OrderDate) = 1997
AND MONTH(o.OrderDate) = 3
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
JOIN Products AS p
ON od.ProductID = p.ProductID
JOIN Categories AS c
ON p.CategoryID = c.CategoryID
AND c.CategoryName = 'Meat/Poultry'
GROUP BY s.CompanyName
-- III. --------------------------------------------------
-- 1. Dla każdej kategorii produktu (nazwa), podaj łączną liczbę zamówionych przez klientów jednostek towarów z tej kategorii.
SELECT
c.CategoryName
,SUM(od.Quantity) AS Quantity
FROM
Categories AS c
JOIN Products AS p
ON c.CategoryID= p.CategoryID
JOIN [Order Details]AS od
ON p.ProductID = od.ProductID
GROUP BY c.CategoryName
-- 2. Dla każdej kategorii produktu (nazwa), podaj łączną liczbę zamówionych w 1997r jednostek towarów z tej kategorii.
SELECT
c.CategoryName
,SUM(od.Quantity) AS Quantity
FROM
Categories AS c
JOIN Products AS p
ON c.CategoryID= p.CategoryID
JOIN [Order Details] AS od
ON p.ProductID = od.ProductID
JOIN Orders AS o
ON od.OrderID = o.OrderID
AND YEAR(o.OrderDate) = 1997
GROUP BY c.CategoryName
-- 3. Dla każdej kategorii produktu (nazwa), podaj łączną wartość zamówionych towarów z tej kategorii.
SELECT
c.CategoryName
,CONVERT(
MONEY
,SUM(od.UnitPrice * od.Quantity)
) AS TotalValue
FROM
Categories AS c
JOIN Products AS p
ON c.CategoryID= p.CategoryID
JOIN [Order Details] AS od
ON p.ProductID = od.ProductID
JOIN Orders AS o
ON od.OrderID = o.OrderID
GROUP BY c.CategoryName
-- IV. --------------------------------------------------
-- 1. Dla każdego przewoźnika (nazwa) podaj liczbę zamówień które przewieźli w 1997r
SELECT
s.CompanyName
,COUNT(o.ShipVia) AS OrderCount
FROM
Orders AS o
JOIN Shippers AS s
ON o.ShipVia = s.ShipperID
WHERE YEAR(o.OrderDate) = 1997
GROUP BY s.CompanyName
-- 2. Który z przewoźników był najaktywniejszy (przewiózł największą liczbę zamówień) w 1997r, podaj nazwę tego przewoźnika
SELECT
TOP 1
s.CompanyName
FROM
Orders AS o
JOIN Shippers AS s
ON o.ShipVia = s.ShipperID
WHERE YEAR(o.OrderDate) = 1997
GROUP BY s.CompanyName
ORDER BY COUNT(o.ShipVia) DESC
-- 3. Dla każdego przewoźnika podaj łączną wartość "opłat za przesyłkę" przewożonych przez niego zamówień od '1998-05-03' do '1998-05-29'
SELECT
s.CompanyName
,SUM(o.Freight) AS SumFreight
FROM
Orders AS o
JOIN Shippers AS s
ON o.ShipVia = s.ShipperID
WHERE o.OrderDate BETWEEN '1998-05-03' AND '1998-05-29'
GROUP BY s.CompanyName
-- 4. Dla każdego pracownika (imię i nazwisko) podaj łączną wartość zamówień obsłużonych przez tego pracownika w maju 1996
SELECT
e.FirstName
,e.LastName
,COUNT(o.EmployeeID) AS OrdersCount
FROM
Employees AS e
LEFT JOIN Orders AS o
ON e.EmployeeID = o.EmployeeID
GROUP BY e.FirstName ,e.LastName
-- 5. Który z pracowników obsłużył największą liczbę zamówień w 1996r, podaj imię i nazwisko takiego pracownika
SELECT
TOP 1
e.FirstName
,e.LastName
FROM
Employees AS e
LEFT JOIN Orders AS o
ON e.EmployeeID = o.EmployeeID
GROUP BY e.FirstName ,e.LastName
ORDER BY COUNT(o.EmployeeID)
-- 6. Który z pracowników był najaktywniejszy (obsłużył zamówienia o największej wartości) w 1996r, podaj imię i nazwisko takiego pracownika
SELECT
TOP 1
e.FirstName
,e.LastName
FROM
Employees AS e
LEFT JOIN Orders AS o
ON e.EmployeeID = o.EmployeeID
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
AND YEAR(o.OrderDate) = 1996
GROUP BY e.FirstName ,e.LastName
ORDER BY SUM(od.UnitPrice * od.Quantity *
(1 - od.Discount)) DESC
-- V. --------------------------------------------------
-- 1. Dla każdego pracownika (imię i nazwisko) podaj łączną wartość zamówień obsłużonych przez tego pracownika Ogranicz wynik tylko do pracowników
-- a) którzy mają podwładnych
SELECT
e.FirstName
,e.LastName
,Count(*) AS OrderCount
FROM
(SELECT
DISTINCT
e1.FirstName
,e1.LastName
,e1.EmployeeID
FROM
Employees AS e1
INNER JOIN Employees e2
ON e1.EmployeeID = e2.ReportsTo
GROUP BY e1.EmployeeID, e1.FirstName, e1.LastName
) AS e
INNER JOIN Orders AS o
ON e.EmployeeID = o.EmployeeID
GROUP BY e.FirstName, e.LastName
SELECT
Count(*)
FROM
Orders
WHERE EmployeeID = 2
SELECT
Count(*)
FROM
Orders
WHERE EmployeeID = 5
-- b) którzy nie mają podwładnych
USE Northwind
SELECT
e.EmployeeID
,Count(*) AS OrderCount
FROM
Employees AS e
LEFT JOIN Employees AS e1
ON e.EmployeeID = e1.ReportsTo
JOIN Orders AS o
ON e.EmployeeID = o.EmployeeID
AND e1.ReportsTo IS NULL
GROUP BY e.EmployeeID
-- 2. Napisz polecenie, które wyświetla klientów z Francji którzy w 1998r złożyli więcej niż dwa zamówienia oraz klientów z Niemiec którzy w 1997r złożyli więcej niż trzy zamówienia
SELECT
c.CustomerID
,COUNT(*) AS OrderCount
FROM
Customers AS c
JOIN Orders AS o
ON c.CustomerID = o.CustomerID
WHERE (c.Country= 'Germany' AND YEAR(o.OrderDate) = 1997)
OR (c.Country= 'France' AND YEAR(o.OrderDate) = 1998)
GROUP BY c.CustomerID, c.Country
HAVING
(c.Country = 'France' AND COUNT(*) > 3)
OR (c.Country = 'Germany' AND COUNT(*) > 2)