これが仕事を成し遂げるかもしれないアプローチです。ロジックは、集約サブクエリを使用して中間計算を実行することです。
このクエリは、On_sale
から収益を取得します 年ごとの表。
SELECT
YEAR(sale_date) yr,
SUM(sale_price) amt
FROM
On_sale
GROUP BY
YEAR(sale_date);
この他のクエリは、テーブルSold
を使用して、店舗ごとおよび年間の収益を取得します。 および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);
これで、JOIN
ができます City
を使用したこれらのクエリの結果 およびStore
テーブル。同時に、都市をさまざまなサイズのカテゴリに分割し、それを使用して結果を集計できます。 LEFT JOIN
を使用しています サブクエリの1つが空の結果セットを生成する場合(それ以外の場合、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 '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
この
| sale_year | size_range | revenue |
| --------- | ---------- | ------- |
| 2017 | small | 15 |
| 2018 | medium | 14 |
| 2019 | large | 12 |