sql >> Database teknologi >  >> RDS >> Mysql

Generer forespørgsel ved hjælp af 5 tabeller

Her er en tilgang, der kan få arbejdet gjort. Logikken er at bruge aggregerede underforespørgsler til at udføre de mellemliggende beregninger.

Denne forespørgsel får omsætningen fra On_sale tabel efter år.

SELECT 
    YEAR(sale_date) yr, 
    SUM(sale_price) amt
FROM 
    On_sale
GROUP BY 
    YEAR(sale_date);
 

Denne anden forespørgsel får omsætningen pr. butik og pr. år ved hjælp af tabeller Sold og 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);
 

Nu kan vi JOIN resultaterne af disse forespørgsler med City og Store borde. Samtidig kan vi opdele byerne i forskellige størrelseskategorier og bruge det til at aggregere resultaterne. Jeg bruger LEFT JOIN i tilfælde af at en af ​​underforespørgslerne producerer et tomt resultatsæt (ellers INNER JOIN er 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

Denne demo på DB Fiddle med dine eksempeldata demonstrerer de mellemliggende trin og returnerer til sidst:

| sale_year | size_range | revenue | | --------- | ---------- | ------- | | 2017 | small | 15 | | 2018 | medium | 14 | | 2019 | large | 12 |


  1. LIMIT 10..20 i SQL Server

  2. Transponer rækker til kolonner i MySQL

  3. Tilføjelse af indre join- og hvor-klausul for at INSERT INTO PÅ DUPLICATE KEY UPDATE

  4. ORACLE RAW i strengformat til Standard GUID