2016-06-30 8 views
1

Ich habe zwei Tabellen: area_costs und products_shipped.Zusammenfassen von Daten und JOIN zwei Tabellen ohne entsprechenden Schlüssel

area_costs enthält die Kosten pro Bereich, d. H. Kurierkosten, Transportkosten.

--------------------- 
|year|week|area|cost| 
--------------------- 

Die Tabelle products_shipped enthält alle Produkte, die an Kunden ausgeliefert wurden:

------------------------------------------------------- 
|product_id|area|customer_id|drop_id|date_id|product_price| 
------------------------------------------------------- 

Nun, wie oben erwähnt, gibt es keine passenden Schlüssel, um diese Tabellen zu verknüpfen. Ich möchte eine Berechnung durchführen, die im Wesentlichen die Kosten pro Fläche berechnet und sie durch die Anzahl der Tropfen pro Fläche teilt, um den Durchschnittswert pro Tropfen zu erhalten. Wenn alle Informationen in einer Tabelle zur Verfügung ist, würde ich wahrscheinlich ein:

SELECT area, SUM(cost)/COUNT(drop_id) AS spent_per_drop FROM full_table GROUP by AREA 

Gibt es eine Möglichkeit, dies zur Verfügung gestellt mit den Informationen zu tun?

Beispieldaten:

area_costs:

--------------------- 
|year|week|area|cost| 
|2016|20 |mel |5000| 
|2016|20 |syd |7500| 
|2016|20 |bri |3000| 
|2016|21 |mel |5200| 
|2016|21 |syd |7400| 
--------------------- 

products_shipped:

----------------------------------------------------- 
|product_id|area|customer_id|drop_id  |date_id | 
|515  |syd |100  |515-syd-100-01|20160607| 
|515  |syd |102  |515-syd-102-12|20160607| 
|508  |mel |103  |508-mel-103-03|20160607| 
----------------------------------------------------- 

Lassen Sie uns sagen, dass ich eine SUM tun() auf Woche 20 in der area_costs Tabelle:

SELECT area, SUM(cost_actual) FROM area_costs GROUP BY area 

Ich werde 75 bekommen 00 für Syd. Ich möchte das durch die Anzahl von drop_id in der Tabelle products_shipped teilen, die in den Beispieldaten gibt mir die Anzahl von 2. Daher sollte das Ergebnis 7500/2 = 3750.

Ich kann dies in 2 Abfragen tun , indem man beide Aggregate getrennt erhält und dann die Ergebnisse teilt, aber das ist keine flexible Lösung.

Meine Frage ist: Ist es möglich, dies in einer Abfrage zu tun?

Danke für alle Antworten.

+0

Wenn Sie keinen übereinstimmenden Schlüssel haben, ist keine Berechnung erforderlich. Sie scheinen ein Feld "Bereich" in beiden zu haben. –

+0

Ist die gemeinsame Spalte in beiden Tabellen nicht 'Bereich'? Es wäre besser, wenn Sie einige Beispieldaten geben könnten, die die von Ihnen erwartete Ausgabe erklären. – Utsav

+0

Entschuldigung, vergessen Sie dies zu sagen - die area_costs enthält Werte in den Bereichen, die nicht unbedingt tatsächliche Bereiche in der Tabelle products_shipped sind; betrachte meine Berechnung leider als voreingenommen, wenn ich die Fläche als gemeinsames Feld verwende. – Adrian

Antwort

1

Weil Ihre Beispieldaten nicht wirklich zeigen, wie ein einfacher innerer Join schiefgehen kann, wähle ich nur zwei Aggregationen der area_costs und products_shipped Tabellen in separaten Unterabfragen. Ich schließe dann diese beiden Unterabfragen zusammen, um das Endergebnis zu erhalten. Beachten Sie, dass ich einen LEFT JOIN nur für den Fall verwendet habe, dass ein area in area_costs keine Einträge in products_shipped hat. In diesem Fall zeige ich NA für die ausgegebene-pro-Drop-Statistik an.

SELECT t1.area, 
    CASE WHEN t2.drop_count IS NULL 
     THEN "NA" 
     ELSE CAST((t1.cost_sum/t2.drop_count) AS VARCHAR) 
    END AS spent_per_drop 
FROM 
(
    SELECT area, SUM(cost_actual) AS cost_sum 
    FROM area_costs 
    GROUP BY area 
) t1 
LEFT JOIN 
(
    SELECT area, COUNT(*) AS drop_count 
    FROM products_shipped 
    GROUP BY area 
) t2 
    ON t1.area = t2.area 
+0

Danke für deine Antwort Tim. Die Abfrage gibt mir die gleichen Ergebnisse, wenn ich nur die Tabelle area_costs (SUM (cost)) abfrage, da die Tabelle products_shiped viel größer ist und mir eine größere SUM() gibt, wenn ich mich dem Bereich anschliesse. Was ich im Wesentlichen versuche, ist, die Summe SUM() der Kosten von area_costs zu erhalten und diese durch die gesamte COUNT() von drop_id in products_shipped zu teilen. Beispiel: Gesamtkosten von Bereichskosten, die von einem SUM() abgerufen und dann durch die Gesamtanzahl der Produkte geteilt werden. Ist das möglich? – Adrian

+0

Aktualisiere deine Frage mit klarem Probeneingang und gewünschter Ausgabe. –

+0

Redigiert meine Frage. – Adrian