SUMME für bestimmte Zeilen

7

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.

    
Sonny 19.12.2014, 16:38
quelle

7 Antworten

6

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.

    
radshop 23.12.2014, 08:21
quelle
4

Wie wäre es damit, den Rest zu verlassen und nur einen weiteren Beitritt für die Bevölkerung hinzuzufügen?

%Vor%

SQLFiddle-Demo

    
juergen d 23.12.2014 07:31
quelle
3

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:

%Vor%

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.

    
akmozo 28.12.2014 00:48
quelle
2

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%     
SimarjeetSingh Panghlia 26.12.2014 07:49
quelle
2

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%     
Saharsh Shah 23.12.2014 06:33
quelle
1

Hier ist ein anderer Weg dies zu tun, wenn Sie nicht JOIN oder SUBQUERY

einführen / ändern wollen %Vor%

Ссылка

    
Akash 28.12.2014 19:21
quelle
1

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%     
Thorsten Kettner 28.12.2014 23:20
quelle

Tags und Links