ПРИЄДНАЙТЕСЬ до двох результатів оператора SELECT


174

Чи можна об'єднати результати 2 sql SELECTвисловлювань в одному операторі? У мене є база даних завдань, де кожен запис є окремим завданням, із строками (і a 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
працює добре, дякую за цю відповідь!

Також працюють два оператори вибору, використовуючи також a, LEFT JOINщоб приєднатися до них, і я розумію, як таким чином приєднати декілька selects


Ви не навели приклад очікуваного результату. Тому деякі відповіді - це об'єднуючі результати. Деякі приєднуються. Котрий саме ви хочете?
Філ

Вибачте, я хочу, щоб у моїх результатах були стовпці для KS, Tasks та Kaste KS # Завдання # Пізня особа1 7 1 person2 3 1 person3 2 0 (або null) Крім того, я хочу, щоб людина з’явилася, навіть якщо у них немає пізніх завдань . В даний час досягають цього, використовуючи метод вибору двох операторів за допомогою лівого приєднання (на відміну від запропонованого INNER JOIN, який працює, але не показує особам, які не мають пізніх завдань, оскільки їх немає у другому SELECT. Досягнення цього також із запізненням стовпець, який є СУМОМ (СЛУЧАЙ КОЛИ Вік> Palt ТОЖ 1 ELSE 0 END) Пізно
sylverfyre

Відповіді:


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

1
Це добре працює, хоча я не вказував, що я хочу ВЛІТТЯ ПРИЄДНАЙТЕСЯ, щоб записи відображалися, навіть якщо у них 0 пізніх завдань.
sylverfyre

Прийняв цю відповідь, оскільки відповідає на запитання, яке я найкраще задав, і воно відформатоване як відмінна посилання на приєднання до SELECT тверджень :)
sylverfyre

Відмінна відповідь, але чи може хтось сказати, чи вважається цей тип «рішення» дорогим чи це просто залежить від того, для чого ви його використовуєте?
petrosmm

71

Спробуйте щось подібне:

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

4
Я не міг отримати прийняту відповідь на роботу, але це спрацювало чудово для моїх потреб. Дякую.
Бенвенкер

Працював як шарм. Що стосується мене, це має бути прийнятою відповіддю. Дякую.
nocdib

Працювали для мене! Дякую! Я також спробував використовувати декілька querys (кілька приєднань), і це також прокидається чудово. Якщо хтось цікавиться, ви можете просто додати більше приєднань після останнього "ВКЛ." У прикладі та продовжувати використовувати послідовність: УВІДКЛЮЧАННЯ. X ПРИЄДНАЙТЕСЬ (ЗАПИТАННЯ N -1) НА Y = ZX ПРИЄДНАЙТЕ = Z
cesarmart

43

Використання 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

3
Union або Union All матиме в результаті лише 2 стовпці. Де він хоче 3 з них
SurajS

14

Якщо Age та Palt є стовпцями в одній таблиці, ви можете порахувати (*) всі завдання та підсумовувати лише такі пізні, як ця:

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

1
Це ТОЧНО те, що я хотів, але не знав, як його шукати. Я не думав використовувати SUM (СЛУЧАЙ) - дякую.
sylverfyre

13

ви можете використовувати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.