Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wygeneruj zapytanie za pomocą 5 tabel

Oto podejście, które może wykonać zadanie. Logika polega na użyciu agregujących podzapytań do wykonywania obliczeń pośrednich.

To zapytanie uzyskuje przychody z On_sale tabela według roku.

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

To inne zapytanie pobiera przychód na sklep i na rok przy użyciu tabel Sold i 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);

Teraz możemy JOIN wyniki tych zapytań z City i Store tabele. Jednocześnie możemy podzielić miasta na różne kategorie wielkości i wykorzystać je do zagregowania wyników. Używam LEFT JOIN w przypadku, gdy jedno z podzapytań wygeneruje pusty zestaw wyników (w przeciwnym razie INNER JOIN jest 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

To demo na DB Fiddle z przykładowymi danymi pokazuje kroki pośrednie, a na koniec zwraca:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj wszystkie wiersze w bazie danych o wartość skrótu

  2. MySQL - konkretne kolumny przy łączeniu?

  3. Doctrine 2 Query Builder Funkcja abs

  4. Ping do serwera MySQL przy użyciu JDBC

  5. MySQL Query pobiera ostatnie N wierszy na grupę