2017-01-27 1 views
0

Ich habe ein kleines Problem mit meinem erforderlichen Ergebnis in mysql.Verknüpfen von zwei Mysql-Tabellen und Gruppieren von Spalten

Ich habe zwei Tabellen wie folgt (nur die relevanten Spalten enthalten sind):

CREATE TABLE vehicle_log 
(id int(11) NOT NULL 
,date date NOT NULL 
,fuel_taken varchar(40) NOT NULL 
,vehicle varchar(6) NOT NULL) 

CREATE TABLE fuel_log 
(id int(11) NOT NULL 
,date date NOT NULL 
,fuel_taken varchar(40) NOT NULL 
,vehicle varchar(6) NOT NULL 
) 

Mein Problem ist, ein Ergebnis zu erhalten, die eine Tabelle mit den Fahrzeug und Datumsspalten Gruppierung zurückgibt, während auch eine Summe des Gebens die beiden anderen fuel_amount Spalten wie folgt:

date  vehicle fuel_by_receipt fuel_by_log 
2016-01-01 KKK222    150  NULL 
2016-01-01 KKK252    100   150 
2016-01-31 KKK222    120  NULL 
2016-02-10 KKK252    100  NULL 
2016-02-15 KKK252    50  NULL 
2016-11-10 KKK252    20  NULL 
2016-11-17 KKK252    10  NULL 
2016-01-31 KKK252    NULL   90 

die Verwendung zu sehen wäre, die fuel_amount Spalten in jeder Tabelle für ein bestimmtes Fahrzeug und Datum zu vergleichen, ob es irgendwelche Unterschiede waren und den Benutzer alarmieren. Das würde in PHP gemacht werden, ist aber nicht Gegenstand dieser Frage.

Außerdem müsste ich die Einträge zurückgegeben haben, so dass es innerhalb eines Datumsbereichs + der letzte Eintrag des vorherigen Monats sein muss. (Ich habe bereits den Monat, Berechnung im Vormonat), ich weiß nur nicht, wie ich es in die Abfrage aufnehmen soll.

Ich dachte, der Verwendung einer WHERE-Klausel, so dass:

WHERE Datum < = end_date und Datum> = start_date

Aber ich scheine ein Problem haben nur den letzten Eintrag mit der Auswahl vom letzten Monat. Hier

ist das, was ich bisher:

SELECT f.date 
     , f.vehicle 
     , SUM(f.fuel_taken) fuel_by_receipt 
     , SUM(v.fuel_taken) fuel_by_log 
    FROM fuel_log f 
    LEFT 
    JOIN vehicle_log v 
    ON v.vehicle = f.vehicle 
    AND v.date = f.date 
    GROUP 
    BY f.date 
     , f.vehicle 
     , v.date  #<-- THIS LINE IS REDUNDANT 
     , v.vehicle #<-- AND SO IS THIS 

UNION 

SELECT f.date 
     , f.vehicle 
     , SUM(f.fuel_taken) fuel_by_receipt 
     , SUM(v.fuel_taken) fuel_by_log 
    FROM fuel_log f 
    RIGHT   #<-- NOBODY EVER USES RIGHT JOIN 
    JOIN vehicle_log v 
    ON v.vehicle = f.vehicle 
    AND v.date = f.date 
    GROUP 
    BY f.date 
     , f.vehicle 
     , v.date  #<- THIS IS REDUNDANT 
     , v.vehicle #<- AND SO IS THIS 

Es kann sein, dass ich das von einem sehr schlechten Winkel am nähern, also, wenn Sie irgendwelche Vorschläge haben einen viel besseren und einfacheren Ansatz zu verwenden, würde ich Sei sehr froh.

Vielen Dank für Ihre Hilfe im Voraus.

pat

+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-y-simple- SQL-Abfrage – Strawberry

Antwort

0

Sie interessieren Datum Fahrzeugkombinationen zwischen den beiden Tabellen in Vergleich. Daher sollten Sie zuerst die SUM gruppiert nach Datum und Fahrzeug von einem erhalten und verbinden Sie es auf dem gruppierten Datum Fahrzeug SUMME des anderen. Also nicht die ersten Datensätze der Tabellen, sondern die gruppierten SUMs.

Bevor Sie dies tun, sollten Sie zuerst alle möglichen Daten/Fahrzeug-Kombinationen erhalten (indem Sie das Datum und die Fahrzeugwerte beider Tabellen in einer UNION auswählen und eine DISTINCT anwenden). VERBINDEN Sie das Ergebnis der obigen Operation mit dieser Tabelle in den Feldern Datum/Fahrzeug. Hoffe das wird dich inspiriert!

Verwandte Themen