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

Sådan får du summen i en samlet tabel, når du bruger gruppe ved - at få forkerte resultater

Jeg forstår, at du ønsker, for hver dag:

  • summen af ​​order_items.energy_used for alle ordrer oprettet den dag
  • den created_at og order_sum der svarer til den seneste order oprettet den dag

Dine prøvedata er ikke særlig repræsentative for det - de har kun én ordre pr. dag. Det er også uklart, hvorfor created_at gentages i begge tabeller; du burde virkelig stole på order_id at relatere begge tabeller

Her er en forespørgsel til ovenstående formål:dette virker ved at tilslutte sig orders tabel med en samlet forespørgsel, der beregner den samlede energi pr. dag (ved hjælp af order_id for at få created_at dato fra orders ), og filtrerer på den seneste ordre pr. dag:

select 
    date(o.created_at) date_of_month,
    i.total_energy_used,
    o.created_at last_order_date,
    o.order_sum last_order_sum
from orders o
inner join (
    select date(o1.created_at) date_of_month, sum(i1.energy_used) total_energy_used
    from orders o1
    inner join order_items i1 on o1.id = i1.order_id
    group by date(o1.created_at)
) i on i.date_of_month = date(o.created_at)
where o.created_at = (
    select max(o1.created_at)
    from orders o1
    where date(o1.created_at) = date(o.created_at)
)
 

Demo på DB Fiddle :

dato_of_month | total_energiforbrug | sidste_ordre_dato | sidste_ordre_sum:------------ | ----------------:| :------------------------ | --------------:2020-01-25 | 77 | 25-01-2020 09:13:00 | 25.132020-01-26 | 75 | 26-01-2020 10:14:00 | 14.002020-01-27 | 0 | 27-01-2020 11:13:00 | 35.00

  1. Gennemgå resultatsættet

  2. Sådan vælger du ved hjælp af WITH RECURSIVE-sætning

  3. Hvad er den bedste måde at gemme mediefiler på en database?

  4. Alternativ til at bruge Prepared Statement i Trigger med MySQL