271 votes

JOIN deux résultats de l'instruction SELECT

Est-il possible de joindre les résultats de 2 sql ? SELECT en une seule déclaration ? Je dispose d'une base de données de tâches où chaque enregistrement est une tâche distincte, avec des échéances (et un numéro d'enregistrement). PALT qui est juste un INT de jours du début à la fin. Age est également un INT nombre de jours).

Je veux avoir une table qui a chaque personne dans la table, le nombre de tâches qu'ils ont, et le nombre de LATE les tâches qu'ils ont (le cas échéant).

Je peux facilement obtenir ces données dans des tableaux séparés, comme ceci :

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks

renvoyant des données comme :

ks        # Tasks
person1   7
person2   3

et ensuite je l'ai fait :

SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

qui revient :

ks        # Late
person1   1
person2   1

Et je veux joindre les résultats de ces deux select déclarations (par le KS )

J'essaie d'éviter d'utiliser une table temporaire, mais si c'est la seule façon pratique de procéder, j'aimerais en savoir plus sur l'utilisation des tables temporaires de cette manière.

J'ai aussi essayé de faire une sorte de count() de lignes qui satisfont à une condition, mais je n'ai pas non plus trouvé comment le faire. Si c'est possible, cela fonctionnerait aussi.

Addendum : Désolé, je veux que mes résultats aient des colonnes pour KS , Tasks y Late

KS        # Tasks   # Late
person1   7         1
person2   3         1
person3   2         0  (or null)

En outre, je veux qu'une personne se présente même si elle n'a pas de tâches à accomplir en retard.

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
fonctionne bien, merci pour cette réponse !

Deux instructions select fonctionnent également, en utilisant un LEFT JOIN pour les joindre fonctionne également, et je comprends maintenant comment joindre de multiples select de la manière suivante

405voto

Phil Points 19299
SELECT t1.ks, t1.[# Tasks], COALESCE(t2.[# Late], 0) AS [# Late]
FROM 
    (SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1
LEFT JOIN
    (SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON (t1.ks = t2.ks);

128voto

Mithrandir Points 10545

Essayez quelque chose comme ça :

SELECT 
* 
FROM
(SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks) t1 
INNER JOIN
(SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks) t2
ON t1.ks = t2.ks

69voto

aF. Points 15815

Utilisez UNION :

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

Ou UNION ALL si vous voulez des doublons :

SELECT ks, COUNT(*) AS '# Tasks' FROM Table GROUP BY ks
UNION ALL
SELECT ks, COUNT(*) AS '# Late' FROM Table WHERE Age > Palt GROUP BY ks

22voto

Nikola Markovinović Points 12039

Si Age et Palt sont des colonnes dans le même tableau, vous pouvez compter (*) toutes les tâches et additionner seulement les tâches tardives comme ceci :

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks

19voto

Baz1nga Points 10252

Vous pouvez utiliser le UNION ALL mot-clé pour cela.

Voici la doc MSDN pour le faire en T-SQL http://msdn.microsoft.com/en-us/library/ms180026.aspx

UNION ALL - combine l'ensemble des résultats

UNION- Fait quelque chose comme un Set Union et ne produit pas de valeurs en double.

Pour la différence avec un exemple : http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X