-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQL Solution test
More file actions
59 lines (53 loc) · 1.76 KB
/
SQL Solution test
File metadata and controls
59 lines (53 loc) · 1.76 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
1. SELECT p.vend_id, v.vend_name
FROM Products p
LEFT JOIN Vendors v ON p.vend_id = v.vend_id
LEFT JOIN OrderItems oi ON p.prod_id = oi.prod_id
LEFT JOIN Orders o ON oi.order_num = o.order_num
WHERE YEAR(o.order_date) = «2021» AND p.prod_desc NOT LIKE %зонт%
AND p.prod_id IS NULL;
2. SELECT
YEAR(o.order_date) AS year,
CASE
WHEN v.vend_country = 'USA' THEN 'Американские поставщики'
ELSE 'Неамериканские поставщики'
END AS vendor_type,
AVG(oi.item_price * oi.quantity) AS avg
FROM OrderItems oi
JOIN Orders o ON oi.order_num = o.order_num
JOIN Products p ON oi.prod_id = p.prod_id
JOIN Vendors v ON p.vend_id = v.vend_id
GROUP BY year, v.vend_country;
3.(a)
with prep as
(SELECT
CONCAT(FLOOR(oi.total_cost / 5000) * 5000, ' - ', FLOOR(oi.total_cost / 5000 + 1) * 5000 - 1) AS cost_range,
COUNT(*) AS order_count
FROM (
SELECT oi.order_num, SUM(oi.quantity * oi.item_price) AS total_cost
FROM orderItems oi
GROUP BY oi.order_num
) oi
GROUP BY oi.total_cost
ORDER BY FLOOR(oi.total_cost / 5000))
SELECT
cost_range,
sum(order_count) as total_order_count
from prep
group by cost_range
**(b вариант generates_series в postgersql)**
WITH order_summary AS (
SELECT oi.order_num, SUM(oi.quantity * oi.item_price) AS total_cost
FROM orderItems oi
GROUP BY oi.order_num
)
SELECT
CONCAT(FLOOR(ranges.range / 5000) * 5000,
' - ',
FLOOR(ranges.range / 5000 + 1) * 5000 - 1) AS cost_range,
COUNT(os.total_cost) AS order_count
FROM (
SELECT generate_series(0, cast(CEIL(MAX(total_cost) / 5000) * 5000 - 1 as int), 5000) AS range
from order_summary os
) ranges LEFT JOIN order_summary os on os.total_cost >= ranges.range AND os.total_cost < ranges.range + 5000
GROUP BY ranges.range
ORDER BY 1;