Объединение двух результатов инструкции SELECT
можно ли объединить результаты 2 операторов SQL SELECT в одном операторе? У меня есть база данных задач, где каждая запись является отдельной задачей, с крайними сроками (и PALT, который является всего лишь INT дней от начала до крайнего срока. Возраст - это также количество дней INT.)
Я хочу иметь таблицу, в которой есть каждый человек в таблице, количество задач, которые у них есть, и количество поздних задач, которые у них есть (если есть.)
Я могу получить эти данные в отдельных таблицах , вот так:
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)
Я пытаюсь избежать использования временной таблицы, но если это единственный практический способ сделать это, я хотел бы узнать больше об использовании временных таблиц таким образом.
Я также попытался сделать какой-то подсчет () # строк, которые удовлетворяют a условно, но я тоже не мог понять, как это сделать. Если это возможно, это тоже сработает.
добавление: Извините, я хочу, чтобы мои результаты имели столбцы для KS, задач и Late
KS # Tasks # Late
person1 7 1
person2 3 1
person3 2 0 (or null)
кроме того, я хочу, чтобы человек, даже если у них нет конца задачи.
сумма (случай, когда возраст > Palt, то 1 еще 0 конец) поздно работает хорошо, спасибо за этот ответ!
два оператора select также работают, используя левое соединение, чтобы присоединиться к ним также работает, и я теперь вы понимаете, как объединить несколько вариантов таким образом. Спасибо!
5 ответов:
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
можно использовать
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