Hier ist ein Ansatz, der die Arbeit erledigen könnte. Die Logik besteht darin, aggregierte Unterabfragen zu verwenden, um die Zwischenberechnungen durchzuführen.
Diese Abfrage ruft die Einnahmen aus dem On_sale
ab Tabelle nach Jahr.
SELECT
YEAR(sale_date) yr,
SUM(sale_price) amt
FROM
On_sale
GROUP BY
YEAR(sale_date);
Diese andere Abfrage ruft den Umsatz pro Geschäft und Jahr mithilfe der Tabellen Sold
ab und 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);
Jetzt können wir JOIN
werden die Ergebnisse dieser Abfragen mit dem City
und Store
Tische. Gleichzeitig können wir die Städte in verschiedene Größenklassen einteilen und daraus die Ergebnisse aggregieren. Ich verwende LEFT JOIN
falls eine der Unterabfragen eine leere Ergebnismenge erzeugt (andernfalls INNER JOIN
ist ok):
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
Diese Demo auf DB Fiddle mit Ihren Beispieldaten demonstriert die Zwischenschritte und gibt schließlich zurück:
| sale_year | size_range | revenue |
| --------- | ---------- | ------- |
| 2017 | small | 15 |
| 2018 | medium | 14 |
| 2019 | large | 12 |