Присоединяйтесь к двум операциям SELECT
Можно ли объединить результаты 2 операторов sql 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
)
Я стараюсь избегать использования временной таблицы, но если это единственный практический способ сделать это, я хотел бы узнать больше об использовании временных таблиц таким образом.
Я также пытался создать какой-то ряд 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) Late
работает хорошо, спасибо за этот ответ!
Также работают два оператора выбора, с помощью LEFT JOIN
для их соединения также работает, и теперь я понимаю, как объединить несколько select
таким образом
Ответы
Ответ 1
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);
Ответ 2
Попробуйте что-то вроде этого:
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
Ответ 3
Используйте 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
Ответ 4
Если Age и Palt являются столбцами в одной таблице, вы можете считать (*) все задачи и суммировать только поздние:
select ks,
count(*) tasks,
sum(case when Age > Palt then 1 end) late
from Table
group by ks
Ответ 5
для этого можно использовать ключевое слово 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