2010-03-03 11 views
8

Come faccio a combinare queste due affermazioni di selezione in una query:Come faccio a combinare questi SQL query SELECT in una SELECT

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 

Quindi, mi piacerebbe la query per restituire, qualcosa come:

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

Desidero semplicemente combinare i risultati delle due query sopra. Le due query sono indipendenti l'una dall'altra. I risultati di uno non influiscono sui risultati dell'altra query. Ho semplicemente bisogno di un modo per sbattere i due risultati insieme in uno.

Se qualcuno ha qualche consiglio, per favore fatemelo sapere.

Grazie.

-Laxmidi

+0

Mi manca qualcosa. Perché non puoi unire le due domande insieme? –

+0

Puoi pubblicare la struttura dei tuoi tavoli? – shoover

+2

E perché la gente vota questa domanda? Questa domanda è davvero utile? Sembra piuttosto accademico e superfluo per me. –

risposta

1

Grazie per l'aiuto nel capire questo. Gridare a David Hall, Aaron, Jeffrey Whitledge & NYSystemsAnalyst. Sono andato con l'opzione dummy column:

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

Se ho capito quello che ti serve in modo corretto, è possibile UNION le query insieme, aggiungendo una colonna per farvi sapere che interrogare è venuto da:

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 

Certo dovrete il doppio delle righe e metà dei dati saranno nulli, ma solo "sbattere" i risultati insieme come nel tuo esempio non è usuale.

+0

Hi Aaron, Immagino di non dover restituire i dati in senso orizzontale. Potrei aggiungere una colonna che indicherà se si tratta di incendio o adw e quindi fare in modo che le altre colonne siano vicine e incidenti. -Laxmidi – Laxmidi

+0

Ciao Aaron, Ho dimenticato di dire "grazie" nel mio messaggio precedente. Siamo spiacenti. -Laxmidi – Laxmidi

3

L'esempio che hai fornito indica che vuoi combinare le query orizzontalmente, ma in seguito hai dichiarato che sono completamente indipendenti. Si tratta di istruzioni in conflitto perché normalmente si combinano i dati orizzontalmente quando i record si correlano tra loro. Di seguito è la mia idea di combinarli orizzontalmente, ma ho anche preso nota della mia idea di combinarli verticalmente al di sotto di questo.

Dipende da come si desidera collegarli. Se si sta interrogando sulla base di quartiere, si può fare un join tra le due query più grandi sul fire_neighborhoods = adw_neighborhoods, come ad esempio:

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 

Questo è solo un esempio. Potrebbe essere necessario un join diverso o qualcosa per farlo funzionare per te.

Ora hai dichiarato che le due query sono indipendenti e non si influenzano a vicenda. Se davvero non hanno un terreno comune, dovresti aggiungere una colonna per ogni query che indica la query da cui proviene (ad esempio aggiungi una colonna con un valore costante di 1 per la query di fuoco e una colonna con un valore costante di 2 per l'adw query). Quindi, solo UNION le due grandi domande insieme. Ciò li combinerebbe in modo verticale rispetto a uno orizzontale.

+0

Hi NYSystemsAnalyst, Grazie per il suggerimento di aggiungere colonne con costanti. Probabilmente finirò per farlo. -Laxmidi – Laxmidi

1

Le risposte date dagli altri di utilizzare una colonna aspetto discriminatore come quello che si sta dopo, ma solo nel caso, è possibile aggiungere fittizie colonne posto di supporto per i sindacati come illustrato di seguito:

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

Ciao David, Grazie per il messaggio. Ho provato il tuo suggerimento e sfortunatamente non sono riuscito a farlo funzionare. È possibile aggiungere colonne fittizie in mySQL? -Laxmidi – Laxmidi

+0

@Laxmidi - stai vedendo un errore quando esegui quella sintassi? Non sono sicuro di mySQL, anche se prevedo che dovrebbe funzionare. La domanda del tour è stata ritradotta da qualcuno come tsql, che è l'implementazione di microsoft sql, ora lo riadaccapo. –

0

Visualizzazione due query non correlate side-by-side sono in genere il lavoro del software di report piuttosto che il motore SQL. Il problema qui è che stai chiedendo allo strumento di query di fare qualcosa che non è adatto a fare: visualizzare la formattazione.

Una relazione (che è ciò che il risultato di un SELECT dovrebbe essere, fondamentalmente) è una struttura di dati che fa affermazioni sullo stato del mondo. Ogni riga definisce una serie di proposizioni che sono (idealmente) vere.

Nella tua domanda, le righe contengono concatenazioni arbitrarie di fatti che non si riferiscono l'uno all'altro e su cui non è possibile affermare alcuna proposizione.

+0

Ciao Jeffrey, Hai ragione. Non ha senso restituire i dati orizzontalmente. Grazie -Laxmidi – Laxmidi