web-dev-qa-db-fra.com

JOIN deux résultats d'instruction SELECT

Est-il possible de joindre les résultats de 2 instructions SQL SELECT en une seule? J'ai une base de données de tâches où chaque enregistrement est une tâche distincte, avec des délais (et un PALT, qui est juste un INT de jours du début à la date limite. L'âge est également un nombre de jours INT.)

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

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

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

renvoyer des données comme:

ks        # Tasks
person1   7
person2   3

et puis j'ai

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

qui retourne:

ks        # Late
person1   1
person2   1

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

J'essaie d'éviter d'utiliser une table temporaire, mais si c'est le seul moyen pratique de le faire, j'aimerais en savoir plus sur l'utilisation des tables temporaires de cette manière.

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

Addendum: Désolé, je souhaite que mes résultats comportent des colonnes pour KS, Tasks et Late.

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

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

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

Deux instructions select fonctionnent également, utiliser un LEFT JOIN pour les joindre fonctionne également, et je comprends maintenant comment joindre plusieurs sélections de cette manière. Merci!

150
sylverfyre
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);
228
Phil

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
56
Mithrandir

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
33
aF.

Si Age et Palt sont des colonnes de la même table, vous pouvez compter (*) toutes les tâches et n’ajouter que les dernières comme ceci:

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

vous pouvez utiliser le mot clé UNION ALL pour cela.

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

UNION ALL - combine le jeu de résultats

UNION- Fait quelque chose comme une Union définie et ne génère 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

12
Baz1nga