Ето един подход, който може да свърши работата. Логиката е да се използват обобщени подзаявки за извършване на междинните изчисления.
Тази заявка получава приходите от On_sale
таблица по години.
SELECT YEAR(sale_date) yr, SUM(sale_price) amtFROM On_saleGROUP BY YEAR(sale_date);
Тази друга заявка получава приходите на магазин и на година, като използва таблици Продадени
и Продукт
:
SELECT s.store_number, YEAR(s.sold_date) yr, SUM(s.sold_quantity * p.retail_price) amtFROM Sold s INNER JOIN Product p ON p.pid =s.pidGROUP BY s.store_number, YEAR (sold_date);
Сега можем да СЕ ПРИСЪЕДИНИМ
резултатите от тези заявки с Град
и Магазин
маси. В същото време можем да разделим градовете в различни категории по размер и да използваме това, за да обобщим резултатите. Използвам LEFT JOIN
в случай че една от подзаявките генерира празен набор от резултати (в противен случай, INNER JOIN
е добре):
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 'mall ' END as size_range, SUM(COALESCE(so.amt, 0) + COALESCE(sa.amt, 0)) earningsFROM 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.yrGROUP BY sale_year, size_rangeORDER BY sale_year, size_range
Това демо на DB Fiddle с вашите примерни данни демонстрира междинните стъпки и накрая връща:
<предварителен код>| година на продажба | диапазон_размер | приходи || --------- | ---------- | ------- || 2017 | малък | 15 || 2018 | средно | 14 || 2019 | голям | 12 |