Gegeben die folgenden Tabellenstrukturen:
%Vor%... und diese Abfrage ...
%Vor% Wie füge ich einen SUM
des regions.population
-Werts hinzu, um die Bevölkerung des Landes zu berechnen? Ich muss den Wert jeder Region nur einmal beim Summieren verwenden, aber das nicht gruppierte Ergebnis enthält mehrere Zeilen für jede Region (die Anzahl der Städte in dieser Region).
Beispieldaten:
%Vor%Gewünschte Ausgabe mit Beispieldaten:
%Vor% Ich bevorzuge eine Lösung, bei der die JOIN
Logik nicht geändert werden muss.
Die akzeptierte Lösung für dieser Post scheint in der Nähe dessen zu sein, wonach ich suche, aber ich konnte nicht herausfinden, wie ich ihn auf mein Problem anwenden könnte.
Meine Lösung
%Vor%Hinweis: Meine eigentliche Suchanfrage ist viel komplexer und hat nichts mit Ländern, Regionen oder Städten zu tun. Dies ist ein minimales Beispiel zur Veranschaulichung meines Problems.
Zunächst einmal ist der andere Post , auf den Sie verweisen, nicht dieselbe Situation. In diesem Fall sind die Joins wie [A - & gt; B und A - & gt; C], so ist der gewichtete Durchschnitt (was diese Berechnung tut) korrekt. In Ihrem Fall sind die Joins wie [A - & gt; B - & gt; C], also brauchen Sie einen anderen Ansatz.
Die einfachste Lösung, die einem sofort in den Sinn kommt, ist eine Unterabfrage, aber keine komplexe:
%Vor%Der Grund dafür ist, dass er die Städte in einer Zeile pro Region auflöst, bevor er sich der Region anschliesst, wodurch die Cross-Join-Situation eliminiert wird.
Wie wäre es damit, den Rest zu verlassen und nur einen weiteren Beitritt für die Bevölkerung hinzuzufügen?
%Vor% Um zu beginnen, sollten Sie wissen, dass die Frage und die Lösung, die in Ihrer Frage erwähnt werden, sich ein wenig von Ihrer Frage und ihrer Lösung unterscheiden. Deshalb können Sie nicht nur JOIN
s ohne Unterabfragen verwenden.
Tabellen:
Länder:
%Vor%Regionen:
%Vor%Städte:
%Vor% Als einfache Methode können Sie countries
table mit einer Unterabfrage verbinden, die regions
und cities
Tabellen verbindet, um 2 Tabellen zu erhalten: countries
und regions
mit cities
Spalten:
SQL:
%Vor%Daten:
%Vor%Dann müssen Sie Ihre normale Anfrage machen, die Ihnen diesen Code gibt:
SQL:
%Vor%Und dieses Ergebnis:
%Vor% Zum Vergleich: Wenn nur JOIN
verwendet wird, werden Länder ohne Regionen und Länder mit Regionen ohne Städte entfernt:
Für Ihr genaues Beispiel (mit Daten in Ihrer Frage erwähnt), erhalten Sie:
%Vor%Ich hoffe, all das kann dir helfen, das zu bekommen, was du willst.
Ich habe sql mit dieser Abfrage für dieselbe Tabelle getestet, die Sie unten angeben
%Vor%und ich habe das Ergebnis, das du willst
%Vor%Verwenden Sie LEFT OUTER JOIN anstelle von INNER JOIN . Wenn das Land keine Regionen hat, wird dieses Land nicht zum Ergebnis kommen, wenn Sie INNER JOIN , selbe wat Wenn irgendwelche Regionen keine Städte haben, dann zählt das nicht zum Ergebnis.
Verwenden Sie also LEFT OUTER JOIN anstelle von INNER JOIN oder JOIN .
Versuchen Sie Folgendes:
%Vor%Überprüfen Sie die SQL FIDDLE DEMO
AUSGABE
%Vor%Ihr Problem ist ziemlich häufig. Sie verbinden alle Tabellen, die etwas mit den Daten zu tun haben, die Sie sehen möchten, und dann beginnen Sie darüber nachzudenken, wie Sie zu diesen Daten gelangen. Wenn es um verschiedene Aggregationen wie in Ihrem Fall geht, ist das nicht einfach zu erreichen.
Sie sollten sich also lieber dem anschließen, was Sie wirklich interessiert. In Ihrem Fall: Länder und (aggregierte) Regions- / Stadtdaten pro Land. Dies hält die Abfrage einfach und einfach zu pflegen.
%Vor%