Присоединяйтесь к двум операциям SELECT

Можно ли объединить результаты двух операторов SELECT в одном заявлении? У меня есть база данных задач, где каждая запись представляет собой отдельную задачу, с крайними сроками (и PALT, которая является всего лишь INT дней от начала до крайнего срока. Age также является INT числом дней).

Я хочу иметь таблицу, в которой есть каждый человек в таблице, количество задач, которые у них есть, и количество заданий LATE, которые у них есть (если они есть).

Я могу легко получить эти данные в отдельных таблицах:

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

возвращение данных, таких как:

 ks # Tasks person1 7 person2 3 

и тогда у меня есть

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

который возвращает:

 ks # Late person1 1 person2 1 

И я хочу присоединиться к результатам этих двух операторов select (по KS)

Я пытаюсь избежать использования таблицы temp, но если это единственный практический способ сделать это, я хотел бы узнать больше об использовании темповых таблиц таким образом.

Я также попытался сделать какое-то количество count () из строк, которые удовлетворяют условию, но я не мог понять, как это сделать. Если это возможно, это тоже сработает.

Добавление: Извините, я хочу, чтобы мои результаты имели столбцы для KS, Tasks и Late

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

Кроме того, я хочу, чтобы человек появился, даже если у них нет никаких поздних задач.

SUM (CASE WHEN Age> Palt THEN 1 ELSE 0 END) Поздно работает хорошо, спасибо за этот ответ!

Также работают два оператора select, используя LEFT JOIN, чтобы присоединиться к ним, и теперь я понимаю, как присоединиться к множественным выборам таким образом. Благодаря!

 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 

Попробуйте что-то вроде этого:

 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 

Использовать 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 

Или UNION ALL если вы хотите дублировать:

 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 

Если Age и Palt являются столбцами в одной таблице, вы можете считать (*) все задачи и суммировать только поздние:

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

для этого вы можете использовать ключевое слово UNION ALL .

Вот документ MSDN, чтобы сделать это в T-SQL http://msdn.microsoft.com/en-us/library/ms180026.aspx

UNION ALL – объединяет результирующий набор

UNION – делает что-то вроде Set Union и не выводит повторяющиеся значения

Для разницы с примером: http://sql-plsql.blogspot.in/2010/05/difference-between-union-union-all.html