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 |