2010-03-03 5 views
8

Wie ich diese beiden select-Anweisungen in einer Abfrage kombinieren Sie:Wie kombiniere ich diese SQL-SELECT-Abfragen in eine SELECT-Anweisung

SELECT SUM(incidents) AS fires, neighborhoods AS fire_neighborhoods 
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location` 
UNION ALL SELECT * 
FROM `fires_2007_incident_location` 
UNION ALL SELECT * 
FROM `fires_2006_incident_location` 
) AS combo 
GROUP BY fire_neighborhoods ORDER BY fires DESC 



SELECT SUM(incidents) AS adw, neighborhoods AS adw_neighborhoods 
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location` 
UNION ALL SELECT * 
FROM `adw_2007_incident_location` 
UNION ALL SELECT * 
FROM `adw_2006_incident_location` 
) AS combo2 
GROUP BY adw_neighborhoods ORDER BY adw DESC 

Also, ich die Abfrage zurückgeben möchten, so etwas wie:

fire_neighborhoods fires adw_neighborhoods adw 
xyzNeighborhood  6  abcNeighborhood 22 
jklNeighborhood  3  tuvNeighborhood 40 

Ich möchte einfach die Ergebnisse der beiden Abfragen oben kombinieren. Die zwei Abfragen sind unabhängig voneinander. Die Ergebnisse von eins wirken sich nicht auf die Ergebnisse der anderen Abfrage aus. Ich brauche einfach einen Weg, um die beiden Ergebnisse zu einem zusammenzuschlagen.

Wenn jemand einen Rat hat, lass es mich wissen.

Vielen Dank.

-Laxmidi

+0

Ich muss etwas fehlen. Warum kannst du nicht einfach die beiden Abfragen zusammenfügen? –

+0

Können Sie die Struktur Ihrer Tabellen veröffentlichen? – shoover

+2

Und warum wählen die Leute diese Frage? Ist diese Frage wirklich nützlich? Es erscheint mir eher akademisch und überflüssig. –

Antwort

1

Vielen Dank für die Hilfe, dies herauszufinden. Rufe nach David Hall, Aaron, Jeffrey Whitledge & NYSystemsAnalyst. Ich ging mit der Dummy-Spalte Option:

SELECT SUM(incidents) , neighborhoods, 'adw' as offense 
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location` 
UNION ALL SELECT * 
FROM `adw_2007_incident_location` 
UNION ALL SELECT * 
FROM `adw_2006_incident_location` 
) AS combo 
GROUP BY neighborhoods 
UNION ALL 
SELECT SUM(incidents), neighborhoods, 'fire' as offense 
FROM (
SELECT * 
FROM `fire_2009_incident_location` 
UNION ALL SELECT * 
FROM `fire_2008_incident_location` 
UNION ALL SELECT * 
FROM `fire_2007_incident_location` 
UNION ALL SELECT * 
FROM `fire_2006_incident_location` 
) AS combo2 
GROUP BY neighborhoods 
2

Wenn ich verstehe, was Sie richtig, dann können Sie UNION die Abfragen zusammen, Hinzufügen einer Spalte, damit Sie wissen, welche Abfrage kam es aus:

SELECT SUM(incidents) AS fires_or_adw, neighborhoods AS fire_or_adw_neighborhoods, 'Fires' as which_query 
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location` 
UNION ALL SELECT * 
FROM `fires_2007_incident_location` 
UNION ALL SELECT * 
FROM `fires_2006_incident_location` 
) AS combo 
GROUP BY fire_neighborhoods ORDER BY fires DESC 

UNION 

SELECT SUM(incidents) AS fires_or_adw, neighborhoods AS fire_or_adw_neighborhoods, 'ADW' as which_query 
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location` 
UNION ALL SELECT * 
FROM `adw_2007_incident_location` 
UNION ALL SELECT * 
FROM `adw_2006_incident_location` 
) AS combo2 
GROUP BY adw_neighborhoods ORDER BY adw DESC 

Zugegeben Sie haben werden doppelt so viele Reihen und die Hälfte Ihrer Daten wird Null sein, aber nur "knallte" die Ergebnisse zusammen, wie in Ihrem Beispiel ist nicht üblich.

+0

Hallo Aaron, Ich denke, dass ich die Daten nicht horizontal zurückgeben müssen. Ich könnte eine Spalte hinzufügen, die angibt, ob es Feuer oder Adw ist und dann die anderen Spalten Nachbarschaft und Vorfälle haben. -Laxmidi – Laxmidi

+0

Hallo Aaron, Ich habe vergessen, "danke" in meiner vorherigen Nachricht zu sagen. Entschuldigung. -Laxmidi – Laxmidi

3

Das Beispiel, das Sie gaben, zeigt an, dass Sie die Abfragen horizontal kombinieren möchten, aber später haben Sie später angegeben, dass sie vollständig unabhängig sind. Dies sind widersprüchliche Anweisungen, da Sie normalerweise Daten horizontal kombinieren, wenn Datensätze miteinander in Beziehung stehen. Unten ist meine Idee, sie horizontal zu kombinieren, aber ich notiere auch meine Idee, sie vertikal darunter zu kombinieren.

Es hängt davon ab, wie Sie sie verknüpfen möchten. Wenn Sie auf Nachbarschaft basieren abfragt, können Sie tun, ein zwischen den beiden größeren Abfragen auf fire_neighborhoods = adw_neighborhoods, wie beitreten:

SELECT fire_neighborhoods, fires, adw 
FROM (

SELECT SUM(incidents) AS fires, neighborhoods AS fire_neighborhoods 
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location` 
UNION ALL SELECT * 
FROM `fires_2007_incident_location` 
UNION ALL SELECT * 
FROM `fires_2006_incident_location` 
) AS combo 
GROUP BY fire_neighborhoods ORDER BY fires DESC 

) AS fires 
    INNER JOIN ( 

SELECT SUM(incidents) AS adw, neighborhoods AS adw_neighborhoods 
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location` 
UNION ALL SELECT * 
FROM `adw_2007_incident_location` 
UNION ALL SELECT * 
FROM `adw_2006_incident_location` 
) AS combo2 
GROUP BY adw_neighborhoods ORDER BY adw DESC 

) AS adw 
    ON fires.fire_neighborhoods = adw.adw_neighborhoods 

Dies ist nur ein Beispiel. Möglicherweise benötigen Sie einen anderen Join oder etwas, damit es für Sie funktioniert.

Nun haben Sie angegeben, dass die beiden Abfragen unabhängig voneinander sind und sich nicht gegenseitig beeinflussen. Wenn sie wirklich keine Gemeinsamkeiten haben, sollten Sie jeder Abfrage eine Spalte hinzufügen, die die Abfrage angibt, aus der sie stammt (z. B. eine Spalte mit einem konstanten Wert von 1 für die Feuerabfrage und eine Spalte mit einem konstanten Wert von 2 für adw hinzufügen Abfrage). Dann, einfach UNION die zwei großen Abfragen zusammen. Dies würde sie in einer vertikalen Weise im Gegensatz zu einer horizontalen Mode kombinieren.

+0

Hallo NYSystemsAnalyst, Vielen Dank für den Vorschlag zum Hinzufügen von Spalten mit Konstanten. Wahrscheinlich werde ich damit enden. -Laxmidi – Laxmidi

1

Die von den anderen gegebenen Antworten von wie einen Diskriminator Spalte Blick mit, was Sie nach, aber nur für den Fall ist es möglich, Dummy-Platzhalter Spalten Gewerkschaften hinzufügen, wie unten gezeigt:

SELECT 
    SUM(incidents) AS fires, 
    neighborhoods AS fire_neighborhoods, 
    0 as adw, 
    '' as adw_neighbourhoods 
FROM ( 
    SELECT * 
    FROM `fires_2009_incident_location` 
    UNION ALL SELECT * 
    FROM `fires_2008_incident_location` 
    UNION ALL SELECT * 
    FROM `fires_2007_incident_location` 
    UNION ALL SELECT * 
    FROM `fires_2006_incident_location` 
) AS combo 
GROUP BY fire_neighborhoods ORDER BY fires DESC 

UNION 

SELECT 
    0 as fires, 
    '' as fire_neighbourhoods, 
    SUM(incidents) AS adw, 
    neighborhoods AS adw_neighborhoods 
FROM ( 
    SELECT * 
    FROM `adw_2009_incident_location` 
    UNION ALL SELECT * 
    FROM `adw_2008_incident_location` 
    UNION ALL SELECT * 
    FROM `adw_2007_incident_location` 
    UNION ALL SELECT * 
    FROM `adw_2006_incident_location` 
) AS combo2 
GROUP BY adw_neighborhoods ORDER BY adw DESC 
+0

Hallo David, Danke für die Nachricht. Ich habe deinen Vorschlag ausprobiert und leider konnte ich es nicht zur Arbeit bringen. Ist es möglich, Dummy-Spalten in mySQL hinzuzufügen? -Laxmidi – Laxmidi

+0

@Laxmidi - sehen Sie einen Fehler, wenn Sie diese Syntax ausführen? Ich bin mir nicht sicher über mySQL, obwohl ich erwarte, dass es funktionieren sollte. Tour Frage wurde von jemandem als Tsql retagged, das ist die Microsoft SQL-Implementierung, ich werde es jetzt zu reagulieren. –

0

angezeigten Zwei nicht verwandte Abfragen nebeneinander sind normalerweise die Aufgabe der Berichtssoftware und nicht die der SQL-Engine. Das Problem besteht darin, dass Sie das Abfrage-Tool dazu auffordern, etwas zu tun, für das es nicht geeignet ist: Formatierung anzeigen.

Eine Relation (was das Ergebnis eines SELECT eigentlich sein soll) ist eine Datenstruktur, die Aussagen über den Zustand der Welt macht. Jede Zeile definiert eine Reihe von Aussagen, die (im Idealfall) wahr sind.

In Ihrer Frage enthalten die Zeilen willkürliche Verknüpfungen von Fakten, die nicht miteinander in Beziehung stehen und über die keine Aussagen gemacht werden können.

+0

Hallo Jeffrey, Sie haben Recht. Es macht keinen Sinn, die Daten horizontal zurückzugeben. Danke -Laxmidi – Laxmidi