Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abfrage mit 5 Tabellen generieren

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      |