Berikut adalah pendekatan yang mungkin menyelesaikan pekerjaan. Logikanya adalah menggunakan subkueri agregat untuk melakukan perhitungan menengah.
Kueri ini mendapatkan pendapatan dari On_sale tabel berdasarkan tahun.
SELECT
YEAR(sale_date) yr,
SUM(sale_price) amt
FROM
On_sale
GROUP BY
YEAR(sale_date);
Kueri lain ini mendapatkan pendapatan per toko dan per tahun, menggunakan tabel Sold dan 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);
Sekarang kita bisa JOIN hasil kueri ini dengan City dan Store tabel. Pada saat yang sama, kami dapat membagi kota ke dalam kategori ukuran yang berbeda dan menggunakannya untuk menggabungkan hasil. Saya menggunakan LEFT JOIN jika salah satu subkueri menghasilkan kumpulan hasil kosong (jika tidak, INNER JOIN tidak apa-apa):
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
demo di DB Fiddle dengan data sampel Anda menunjukkan langkah-langkah perantara, dan akhirnya kembali:
| sale_year | size_range | revenue |
| --------- | ---------- | ------- |
| 2017 | small | 15 |
| 2018 | medium | 14 |
| 2019 | large | 12 |