2010-03-03 14 views
8

Comment combiner ces deux instructions select dans une requête:Comment puis-je combiner ces requêtes SQL SELECT dans une instruction 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 

Alors, je voudrais la requête pour revenir, quelque chose comme:

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

Je veux simplement combiner les résultats des deux requêtes ci-dessus. Les deux requêtes sont indépendantes les unes des autres. Les résultats de l'un n'affectent pas les résultats de l'autre requête. J'ai simplement besoin d'un moyen de claquer les deux résultats en un seul.

Si quelqu'un a des conseils, s'il vous plaît faites le moi savoir.

Merci.

-Laxmidi

+0

Il me manque quelque chose. Pourquoi ne pouvez-vous pas UNION les deux requêtes ensemble? –

+0

Pouvez-vous poster la structure de vos tables? – shoover

+2

Et pourquoi les gens votent-ils pour cette question? Cette question est-elle vraiment utile? Cela me semble plutôt académique et superflu. –

Répondre

1

Merci pour l'aide à comprendre cela. Crier à David Hall, Aaron, Jeffrey Whitledge & NYSystemsAnalyst. Je suis allé avec l'option de colonne factice:

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 je comprends ce que vous avez besoin correctement, vous pouvez les requêtes UNION ensemble, en ajoutant une colonne pour vous faire savoir qui il est venu interroger:

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 

D'accord, vous aurez deux fois plus de lignes et la moitié de vos données seront nulles, mais simplement "claquer" les résultats ensemble comme dans votre exemple n'est pas habituel.

+0

Bonjour Aaron, Je suppose que je n'ai pas besoin de retourner les données horizontalement. Je pourrais ajouter une colonne qui indiquera si c'est fire ou adw et ensuite les autres colonnes seront voisinage et incidents. -Laxmidi – Laxmidi

+0

Salut Aaron, J'ai oublié de dire "merci" dans mon message précédent. Désolé. -Laxmidi – Laxmidi

3

L'exemple que vous avez donné indique que vous souhaitez combiner les requêtes horizontalement, mais vous avez ensuite déclaré qu'elles sont complètement indépendantes. Il s'agit d'instructions contradictoires car vous combinez généralement les données horizontalement lorsque les enregistrements sont liés les uns aux autres. Voici mon idée pour les combiner horizontalement, mais je note aussi mon idée de les combiner verticalement en dessous.

Cela dépend de la manière dont vous voulez les lier. Si vous interrogez basé sur le quartier, vous pouvez faire une jointure entre les deux grandes requêtes sur fire_neighborhoods = adw_neighborhoods, tels que:

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 

Ceci est juste un exemple. Vous pouvez avoir besoin d'une jointure différente ou de quelque chose pour le faire fonctionner pour vous.

Maintenant, vous avez déclaré que les deux requêtes sont indépendantes et ne se touchent pas mutuellement. Si elles n'ont vraiment aucun terrain commun, vous devez ajouter une colonne à chaque requête indiquant la requête dont elle provient (par exemple, ajoutez une colonne avec une valeur constante de 1 pour la requête incendie et une colonne avec une valeur constante de 2 pour la requête question). Ensuite, juste UNION les deux grandes requêtes ensemble. Cela les combinerait de manière verticale par opposition à une mode horizontale.

+0

Salut NYSystemsAnalyst, Merci pour la suggestion d'ajouter des colonnes avec des constantes. Je finirai probablement par faire ça. -Laxmidi – Laxmidi

1

Les réponses données par les autres d'utiliser un regard de colonne discriminante comme ce que vous recherchez, mais juste au cas où, il est possible d'ajouter des colonnes de support place factices aux syndicats comme indiqué ci-dessous:

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

Salut David, Merci pour le message. J'ai essayé votre suggestion et malheureusement, je ne pouvais pas le faire fonctionner. Est-il possible d'ajouter des colonnes factices dans mySQL? -Laxmidi – Laxmidi

+0

@Laxmidi - une erreur se produit-elle lorsque vous exécutez cette syntaxe? Je ne suis pas sûr de mySQL, bien que je m'attends à ce que cela fonctionne. Question de tournée a été repérée par quelqu'un comme tsql qui est l'implémentation de microsoft sql, je vais le repasser maintenant. –

0

Affichage Deux requêtes indépendantes sont généralement la tâche du logiciel de reporting plutôt que le moteur SQL. Le problème ici est que vous demandez à l'outil de requête de faire quelque chose qu'il n'est pas adapté à faire: afficher le formatage.

Une relation (qui est ce que le résultat d'un SELECT est censé être, au fond) est une structure de données qui fait des affirmations sur l'état du monde. Chaque rangée définit une série de propositions qui sont (idéalement) vraies.

Dans votre question, les lignes contiennent des concatinations arbitraires de faits qui ne se rapportent pas les uns aux autres et sur lesquels aucune proposition ne peut être énoncée.

+0

Salut Jeffrey, Vous avez raison. Cela n'a aucun sens de renvoyer les données horizontalement. Remerciements -Laxmidi – Laxmidi