Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir la somme dans une table jointe lors de l'utilisation de group by - obtenir de mauvais résultats

Je comprends que vous souhaitiez, pour chaque jour :

  • la somme de order_items.energy_used pour toutes les commandes créées ce jour
  • le created_at et order_sum qui correspondent à la dernière order créé ce jour

Vos données d'échantillon ne sont pas très représentatives de cela - il n'y a qu'une seule commande par jour. De plus, il n'est pas clair pourquoi created_at est répété dans les deux tableaux ; vous devriez vraiment vous fier au order_id pour relier les deux tables

Voici une requête dans le but ci-dessus :cela fonctionne en joignant les orders table avec une requête agrégée qui calcule l'énergie totale par jour (en utilisant order_id pour obtenir le created_at date de orders ), et filtre sur la dernière commande par jour :

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)
)

Démo sur DB Fiddle :

date_of_month | total_energy_used | last_order_date     | last_order_sum
:------------ | ----------------: | :------------------ | -------------:
2020-01-25    |                77 | 2020-01-25 09:13:00 |          25.13
2020-01-26    |                75 | 2020-01-26 10:14:00 |          14.00
2020-01-27    |                 0 | 2020-01-27 11:13:00 |          35.00