Autor Zpráva
Gullator
Profil *
Dobrý den,

napsal jsem si SQL dotaz do e-shopu, kdy zjišťuji jak se v měsících měnila průměrná doba odeslání zboží od jeho objednání. SQL dotaz vypadá následovně -

SELECT AVG(DATEDIFF(os.time, o.ordered)) AS prumerna_hodnota, 
            YEAR(os.time) AS groupYear, 
            MONTH(os.time) AS groupMonth 
FROM orders AS o 
            LEFT JOIN order_status_history os ON o.id = os.order_id 
WHERE  os.status_id = 2 
GROUP BY groupyear, groupmonth 

A rád bych měl v selectu ještě průměrnou hodnotu z minulého měsíce. Vůbec netuším jak se k tomu dostat. Zkoušel jsem ještě LEFT JOIN s ON na -1 měsíc. Ale to vykazovalo špatné hodnoty, tak jsem usoudil že to nebude správné řešení.

Předem díky za nakopnutí.
Kajman
Profil
Gullator:

Pokud to máte v mysql, tak bych porovnání dělal raději až v aplikační vrstvě při vypisování (tedy s v php zapamatovat průměrnou hodnotu minulého řádku a tu pak porovnat s aktuálním řádkem.
Gullator
Profil *
Vyřešeno včetně procentuálního rozdílu:

SELECT 
    AVG(DATEDIFF(os.time, o.ordered)) AS average_value, 
    previous_month.average_value AS previous_value,
    YEAR(os.time) AS groupYear, 
    MONTH(os.time) AS groupMonth,
    ROUND(((AVG(DATEDIFF(os.time, o.ordered)) - previous_month.average_value) / AVG(DATEDIFF(os.time, o.ordered)) * 100), 2) percentage_diff
FROM orders AS o
    LEFT JOIN order_status_history os ON o.id = os.order_id 
    LEFT JOIN (
        SELECT AVG(DATEDIFF(os.time, o.ordered)) AS average_value, 
               YEAR(os.time) AS groupYear, 
               MONTH(os.time) AS groupMonth 
            FROM orders AS o
            LEFT JOIN order_status_history os ON o.id = os.order_id 
            WHERE  os.status_id = 2 
            GROUP BY DATE_FORMAT(os.`time`, '%Y%my')
          ) AS previous_month ON previous_month.groupYear = YEAR(SUBDATE(os.time, INTERVAL 1 MONTH)) 
                                AND previous_month.groupMonth = MONTH(SUBDATE(os.time, INTERVAL 1 MONTH))
WHERE  os.status_id = 2 
GROUP BY DATE_FORMAT(os.`time`, '%Y%my')
ORDER BY groupYear DESC, groupMonth DESC;

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0