Вопрос по sql – ПРИСОЕДИНЯЙТЕСЬ к двум результатам SELECT

133

Можно ли объединить результаты 2 операторов SELECT в одном операторе? У меня есть база данных задач, где каждая запись - это отдельная задача со сроками исполнения (и PALT, который представляет собой просто INT дней от начала до крайнего срока. Age также 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

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

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

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

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

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

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

СУММА (СЛУЧАЙ, КОГДА ВОЗРАСТ & gt; Palt THEN 1 ELSE 0 END) Поздно работает хорошо, спасибо за этот ответ!

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

Вы не привели пример ожидаемого результата. Таким образом, некоторые ответы касаются результатов. Некоторые присоединяются. Какой вы хотите? Phil
Извините, я хочу, чтобы в моих результатах были столбцы для KS, Tasks и Late KS # Задачи # Late person1 7 1 person2 3 1 person3 2 0 (или null) Кроме того, я хочу, чтобы этот человек появлялся, даже если у него нет поздних задач , В настоящее время это достигается с помощью метода двух операторов select с LEFT JOIN (в отличие от предложенного INNER JOIN, который работает, но не показывает людей, у которых нет поздних задач, потому что они не существуют во втором SELECT. Также достигается это с поздним столбец СУММА (СЛУЧАЙ КОГДА Возраст & gt; Пальто ТОГДА 1 ИЛИ 0 КОНЕЦ) Поздно sylverfyre

Ваш Ответ

5   ответов
209

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);
Error: User Rate Limit Exceeded sylverfyre
Error: User Rate Limit Exceeded sylverfyre
31

использование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
Error: User Rate Limit Exceeded
13

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

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks
Error: User Rate Limit Exceeded sylverfyre
13

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

Вот документ MSDN, чтобы сделать это в T-SQLhttp://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

48

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

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
Error: User Rate Limit Exceeded

Похожие вопросы