Đây là một cách tiếp cận có thể hoàn thành công việc. Logic là sử dụng các truy vấn con tổng hợp để thực hiện các phép tính trung gian.
Truy vấn này nhận doanh thu từ On_sale
bảng theo năm.
SELECT
YEAR(sale_date) yr,
SUM(sale_price) amt
FROM
On_sale
GROUP BY
YEAR(sale_date);
Truy vấn khác này lấy doanh thu trên mỗi cửa hàng và mỗi năm, sử dụng các bảng Sold
và Product
:
SELECT
s.store_number,
YEAR(s.sold_date) yr,
SUM(s.sold_quantity * p.retail_price) amt
FROM
Sold s
INNER JOIN Product p
ON p.pid = s.pid
GROUP BY
s.store_number,
YEAR(sold_date);
Bây giờ chúng ta có thể JOIN
kết quả của những truy vấn này với City
và Store
những cái bàn. Đồng thời, chúng tôi có thể chia các thành phố thành các loại kích thước khác nhau và sử dụng chúng để tổng hợp kết quả. Tôi đang sử dụng LEFT JOIN
trong trường hợp một trong các truy vấn con tạo ra tập kết quả trống (khác, INNER JOIN
ổn):
SELECT
COALESCE(sa.yr, so.yr) sale_year,
CASE
WHEN c.population > 200 THEN 'large'
WHEN c.population <= 200 AND c.population > 100 THEN 'medium'
ELSE 'small'
END as size_range,
SUM(COALESCE(so.amt, 0) + COALESCE(sa.amt, 0)) revenue
FROM
City c
INNER JOIN Store st
ON st.state = c.state
AND st.city_name = c.city_name
LEFT JOIN (
SELECT
s.store_number,
YEAR(s.sold_date) yr,
SUM(s.sold_quantity * p.retail_price) amt
FROM
Sold s
INNER JOIN Product p
ON p.pid = s.pid
GROUP BY
s.store_number,
YEAR(sold_date)
) so
ON so.store_number = st.store_number
LEFT JOIN (
SELECT
YEAR(sale_date) yr,
SUM(sale_price) amt
FROM
On_sale
GROUP BY
YEAR(sale_date)
) sa
ON sa.yr = so.yr
GROUP BY
sale_year,
size_range
ORDER BY
sale_year,
size_range
bản trình diễn này trên DB Fiddle với dữ liệu mẫu của bạn thể hiện các bước trung gian và cuối cùng trả về:
| sale_year | size_range | revenue |
| --------- | ---------- | ------- |
| 2017 | small | 15 |
| 2018 | medium | 14 |
| 2019 | large | 12 |