2017-04-18 12 views
0

Ich bin ziemlich neu in MySQL und arbeite an einer Abfrage, die die Daten aus einer Spalte in einer Tabelle durch die Daten aus einer Spalte in einer anderen Tabelle teilen sollte. Ich hatte eine gute Jagd auf der Website, kann aber nicht das finden, wonach ich suche (oder es könnte ein Mangel an Verständnis meinerseits sein). Ich möchte den TotalSpend von TotalHires teilen und denke, dass ich ziemlich nah dran bin, aber es ist nicht ganz richtig.Wie teile ich Daten aus einer Spalte in einer Tabelle mit Daten aus einer Spalte in einer anderen Tabelle?

Ich habe 4 Zeilen von Daten in jeder Spalte und bin auf der Suche nach 4 Berechnungen ausgeführt werden. Im Moment werden 16 Ergebnisse zurückgegeben. Ich möchte nur Daten teilen, die sich auf dieselbe Mitglieds-ID beziehen, denke aber, dass jede Zelle in einer Spalte durch jede Zelle in der anderen Spalte geteilt wird. Wie kann ich meinen Code ändern, um nur die gewünschten 4 Berechnungen zurückzugeben?

Gesamtausgaben:

SELECT garment_hire_header.member_id, garment_hire_line.hire_id, SUM(garment_hire_line.days*catalogue.daily_rate) AS 'Total Spend' 
FROM garment_hire_line 
JOIN garment_hire_header ON garment_hire_line.hire_id = garment_hire_header.hire_id 
JOIN garment ON garment_hire_line.garment_id = garment.garment_id 
JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id 
Group by garment_hire_header.member_id 

TotalHires:

SELECT garment_hire_header.member_id, COUNT(garment_hire_header.hire_id) as TotalHires 
FROM garment_hire_header 
Group by garment_hire_header.member_id 

Fast endgültige Code arbeiten (liefert 16 Berechnungen):

SELECT s.TotalSpend/h.TotalHires 
from (SELECT SUM(garment_hire_line.days*catalogue.daily_rate) AS TotalSpend 
FROM garment_hire_line 
JOIN garment_hire_header ON garment_hire_line.hire_id = garment_hire_header.hire_id 
JOIN garment ON garment_hire_line.garment_id = garment.garment_id 
JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id 
Group by garment_hire_header.member_id) s CROSS JOIN 
(SELECT COUNT(garment_hire_header.hire_id) as TotalHires 
FROM garment_hire_header 
Group by garment_hire_header.member_id) h 

Jetzt, wo das funktioniert Ich bin versuchen, es ein wenig zu drücken des Weiteren. Ich möchte nur die Daten angezeigt werden, wenn die hire_id in einer anderen Frage gefunden wird

Ich habe versucht, die folgende Zugabe, die in der Vergangenheit auf verschiedene Abfragen, aber aus irgendeinem Grund nicht funktioniert in diesem Fall gearbeitet hat:

WHERE garment_hire_line.hire_id IN 
(SELECT hire_id, DATE_ADD(date_out, INTERVAL (days) DAY) AS 'Expected Return', DATEDIFF(return_date, DATE_ADD(date_out, INTERVAL (days) DAY)) as 'Days Late' 
FROM garment_hire_line 
WHERE DATEDIFF(return_date, DATE_ADD(date_out, INTERVAL (days) DAY)) > 0 
ORDER BY hire_id) 

Antwort

0

Es ist möglich, dies zu beheben, indem Sie einfach Ihre cross join in eine left join ändern und dann die member_id hinzufügen, um die Tabellen zu vergleichen. Allerdings gibt es ein viel schöner Ansatz für diese Situation:

SELECT garment_hire_header.member_id, garment_hire_line.hire_id, 
SUM(garment_hire_line.days*catalogue.daily_rate) AS 'Total Spend', 
SQ1.TotalHires, 
SUM(garment_hire_line.days*catalogue.daily_rate)/SQ1.TotalHires AS `Total` 
FROM garment_hire_line 
LEFT JOIN garment_hire_header ON garment_hire_line.hire_id = 
garment_hire_header.hire_id 
LEFT JOIN garment ON garment_hire_line.garment_id = garment.garment_id 
LEFT JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id 
LEFT JOIN (SELECT garment_hire_header.member_id, 
COUNT(garment_hire_header.hire_id) as TotalHires 
FROM garment_hire_header 
Group by garment_hire_header.member_id) AS SQ1 ON SQ1.member_id = 
garment_hire_header.member_id 
Group by garment_hire_header.member_id; 

ich Ihren ursprünglichen Code verlassen haben, da es so viel wie möglich war. Der entscheidende Punkt dabei ist, dass Sie bei der Verwendung der gleichen Tabellen für die Berechnung nicht alles in Unterabfragen ablegen müssen. Ich habe auch Ihre joins in left joins umbenannt, dies ändert nicht die Art und Weise, wie die Abfrage funktioniert, aber es ist angenehmer, den Join-Typ anzugeben, den Sie gerade ausführen.

+0

Hallo Martyn. Vielen Dank, das bringt zurück, was ich suchte. Ich denke, ich habe es übertrieben, Dinge zu verkomplizieren, wenn ich verschiedene Dinge ausprobiere. Ihre Antwort hat mich dazu veranlasst, einen Schritt zurück zu machen und neu zu bewerten. Ich könnte die Dinge in Zukunft etwas anders angehen. Prost! – Lumsden

Verwandte Themen