2010-03-03 30 views
8

¿Cómo combino estas dos sentencias de selección en una consulta:¿Cómo combino estas consultas SQL SELECT en una instrucción 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 

Por lo tanto, me gustaría que devuelva la consulta, algo así como:

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

Simplemente quiero combinar los resultados de las dos consultas anteriores. Las dos consultas son independientes entre sí. Los resultados de uno no afectan los resultados de la otra consulta. Simplemente necesito una manera de unir los dos resultados en uno solo.

Si alguien tiene algún consejo, por favor avíseme.

Gracias.

-Laxmidi

+0

Me falta algo. ¿Por qué no puedes UNION las dos consultas juntas? –

+0

¿Puedes publicar la estructura de tus tablas? – shoover

+2

¿Y por qué las personas votan esta pregunta? ¿Es esta pregunta realmente útil? Me parece bastante académico y superfluo. –

Respuesta

1

Gracias por la ayuda para resolver esto. Grite a David Hall, Aaron, Jeffrey Whitledge & NYSystemsAnalyst. Fui con la opción de columna ficticia:

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

Si entiendo lo que necesita correctamente, puede UNIÓN las consultas juntos, añadiendo una columna para hacerle saber qué consulta se trataba de:

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 

Por supuesto que tendrá el doble de filas y la mitad de sus datos serán nulos, pero solo "cerrar" los resultados juntos ya que en su ejemplo no es habitual.

+0

Hola Aaron, supongo que no necesito para devolver los datos horizontalmente. Podría agregar una columna que indicará si es fire o adw y luego las otras columnas serán vecindario e incidentes. -Laxmidi – Laxmidi

+0

Hola Aaron, Olvidé decir "gracias" en mi mensaje anterior. Lo siento. -Laxmidi – Laxmidi

3

El ejemplo que proporcionó indica que desea combinar las consultas horizontalmente, pero luego declaró que son completamente independientes. Estas son declaraciones contradictorias porque normalmente se combinan los datos horizontalmente cuando los registros se relacionan entre sí. A continuación se muestra mi idea para combinarlos horizontalmente, pero también tomo nota de mi idea para combinarlos verticalmente debajo de eso.

Depende cómo desee vincularlos. Si está consultas basadas en el barrio, se puede hacer una unión entre las dos consultas más grandes en fire_neighborhoods = adw_neighborhoods, tales como:

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 

Esto es sólo un ejemplo. Es posible que necesite una unión diferente o algo para que funcione para usted.

Ahora, indicó que las dos consultas son independientes y no se afectan entre sí. Si realmente no tienen puntos en común, debe agregar una columna a cada consulta que indique la consulta de la que proviene (por ejemplo, agregue una columna con un valor constante de 1 para la consulta de incendios y una columna con un valor constante de 2 para el adw consulta). Entonces, solo UNIÓN las dos grandes consultas juntas. Esto los combinaría de una manera vertical en oposición a una moda horizontal.

+0

Hola NYSystemsAnalyst, Gracias por la sugerencia de agregar columnas con constantes. Probablemente termine haciendo eso. -Laxmidi – Laxmidi

1

Las respuestas dadas por los otros de la utilización de un vistazo columna discriminadora como lo que está después, pero por si acaso, es posible añadir columnas lugar titular ficticias para los sindicatos como se muestra a continuación:

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

Hola David, Gracias por el mensaje. Probé tu sugerencia y, desafortunadamente, no pude hacer que funcionara. ¿Es posible agregar columnas ficticias en mySQL? -Laxmidi – Laxmidi

+0

@Laxmidi - ¿Ve un error cuando ejecuta esa sintaxis? No estoy seguro acerca de mySQL, aunque espero que funcione. La pregunta del recorrido fue retenida por alguien como tsql, que es la implementación de microsoft sql, voy a volver a etiquetarla ahora. –

0

Viendo dos consultas no relacionadas lado a lado suelen ser el trabajo del software de informes en lugar del motor de SQL. El problema aquí es que le está pidiendo a la herramienta de consulta que haga algo para lo que no es adecuado: mostrar el formato.

Una relación (que es lo que el resultado de un SELECT se supone que es, fundamentalmente) es una estructura de datos que hace afirmaciones sobre el estado del mundo. Cada fila define una serie de proposiciones que son (idealmente) verdaderas.

En su pregunta, las filas contienen concatenaciones arbitrarias de hechos que no se relacionan entre sí y sobre los cuales no se pueden establecer proposiciones.

+0

Hola Jeffrey, Tienes razón. No tiene sentido devolver los datos horizontalmente. Gracias -Laxmidi – Laxmidi

Cuestiones relacionadas