Utolsó 30 nap lekérése SQL
2021-11-23T19:53:09+01:00
2021-11-24T12:33:01+01:00
2022-08-12T05:45:30+02:00
kviktor12340
Sziasztok, olyan kérdéssel fordulnék felétek, hogy szeretném lekérni az utolsó 30 nap rendeléseit, de a hiányzó dátumokat szeretném kitölteni nullával. Azaz egy példa:

SELECT DATE(o_date) as date, count(id) AS sum FROM customers WHERE o_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND NOW() GROUP BY o_date
Ez ugye szépen kilistázza az elmúlt 30 nap rendeléseit de ha például egy nap nem volt egy rendelés sem akkor azt kihagyja. pl.:

id | o_date |
1 | 2021-11-23 |
2 | 2021-11-23 |
3 | 2021- 11-21 |
4 | 2021-11-20 |


A válasz az ez lesz:

|date|sum|
|2021-11-23| 2 |
|2021-11-21| 1 |
|2021-11-20| 1 |

Na most a 2021-11-22 es dátumot kihagyta mivel nem szerepel ilyen a táblázatban. Hogyan tudnám úgy átirni a lekérdezést, hogy ne hagyja ki a hiányzó dátumokat? Jobban mondva a sum legyen 0 a dátum mellett. Ha lehetséges akkor segédtáblázat nélkül szeretném megoldani.  (Segédtáblázattal)

Köszi!
Mutasd a teljes hozzászólást!
Hali!

… MariaDB-n nem sikerült megoldani a problémám.

Milyen verziójú MariaDB-t használsz? Megnézted H.Lilla által ajánlott másik témát? Mi nem megy?

Az elmúlt 30 nap dátumait pl. a következő SQL-mondattal tudod lekérni (segédtábla nélkül, Sequence Storage Engine-t használva):
SELECT DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY) AS `date` FROM `seq_29_to_0` AS `seq`
Ennek az eredménye (ma):
2021-10-26 2021-10-27 2021-10-28 … 2021-11-24
Tehát, van egy dátum-listád az elmúlt 30 napról. Ehhez hozzá kell kapcsolnod a rendelések táblát. Értelemszerűen LEFT JOIN-nal, mivel nem minden napra lehet rendelés (de a nap jelenjen meg az eredményeknél):
SELECT DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY) AS `date` , COUNT(`c`.`id`) AS `sum` FROM `seq_29_to_0` AS `seq` LEFT JOIN `customers` AS `c` ON (DATE(`c`.`o_date`) = DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY)) GROUP BY DATE(`c`.`o_date`)
Ez így nem jó?

Nem mellesleg: rendelési adatok miért az ügyfél-táblában vannak?

Mutasd a teljes hozzászólást!

  • Ez nagyon hasonló probléma a tiédhez:
    MySQL havi bontas hianyzo honapok potlasa probléma
    Mutasd a teljes hozzászólást!
  • Szia, köszönöm a válaszod, de sajnos MariaDB-n nem sikerült megoldani a problémám.
    Mutasd a teljes hozzászólást!
  • Hali!

    … MariaDB-n nem sikerült megoldani a problémám.

    Milyen verziójú MariaDB-t használsz? Megnézted H.Lilla által ajánlott másik témát? Mi nem megy?

    Az elmúlt 30 nap dátumait pl. a következő SQL-mondattal tudod lekérni (segédtábla nélkül, Sequence Storage Engine-t használva):
    SELECT DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY) AS `date` FROM `seq_29_to_0` AS `seq`
    Ennek az eredménye (ma):
    2021-10-26 2021-10-27 2021-10-28 … 2021-11-24
    Tehát, van egy dátum-listád az elmúlt 30 napról. Ehhez hozzá kell kapcsolnod a rendelések táblát. Értelemszerűen LEFT JOIN-nal, mivel nem minden napra lehet rendelés (de a nap jelenjen meg az eredményeknél):
    SELECT DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY) AS `date` , COUNT(`c`.`id`) AS `sum` FROM `seq_29_to_0` AS `seq` LEFT JOIN `customers` AS `c` ON (DATE(`c`.`o_date`) = DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY)) GROUP BY DATE(`c`.`o_date`)
    Ez így nem jó?

    Nem mellesleg: rendelési adatok miért az ügyfél-táblában vannak?

    Mutasd a teljes hozzászólást!
  • szia,
    Köszönöm a válaszod, mint az általad emlitett példában is valamiért mindig kihagy egy dátumot. Küldök egy képernyőfotót.  Itt a 2021-11-20 as dátum hiányzik a 2021-11-19 pedig az első lett valamiért. (A valóságban 11.20 illetve 11.19-edikére sincsenek adatok, a többi az rendben van.) Egyébként  tökéletes lenne a megoldásod pont ilyesmire gondoltam. 

    Mellesleg nem az ügyfél adatoknál vannak a rendelési adatok de viszont az ügyfél létrehozási dátum ott szerepel, a felesleges sok tábla elkerülése érdekében. 

    Köszönöm mégegyszer! :)
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Hali!

    … valamiért mindig kihagy egy dátumot.

    Mi a pontos SQL-mondat, amit futtatsz? Be tudnád illeszteni?

    … a 2021-11-19 pedig az első lett valamiért.

    Azért, egy ORDER BY-kitételt (pl. ORDER BY `seq`.`seq` DESC) nem nagy ördöngösség hozzáfűzni.

    … de viszont az ügyfél létrehozási dátum ott szerepel, a felesleges sok tábla elkerülése érdekében. 

    Mi köze van az ügyfél létrehozási dátumának a rendelés dátumához? Vagy minden egyes rendelésnél új ügyfelet hozol létre?

    Próbáld ki a következő SQL-mondatot:
    SELECT DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY) AS `date` , COUNT(`c`.`id`) AS `sum` FROM `seq_29_to_0` AS `seq` LEFT JOIN `customers` AS `c` ON (DATE(`c`.`o_date`) = DATE_SUB(CURDATE(), INTERVAL `seq`.`seq` DAY)) GROUP BY `seq`.`seq` ORDER BY `seq`.`seq` DESC
    Mutasd a teljes hozzászólást!
  • szia, 
    Ismételten köszönöm a válaszod, igen nagyjából ahogy mondod minden rendelés egy új külön sor a customers táblázatban. Ennek igazából több oka is van, de azt picit hosszú lenne elmagyarázni. 

    Az általad irt SQL mondat tökéletesen működik. 
    Köszönöm mégegyszer! :) Legyen szép napod!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd