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!
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);
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
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
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
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