2012-05-10 18 views
98

Czy można dołączyć do wyników 2 sql SELECT w jednej instrukcji? Mam bazę danych zadań, w których każdy rekord jest oddzielnym zadaniem, z terminami (i PALT, który jest tylko INT dni od początku do terminu. Wiek jest również INT liczba dni.)DOŁĄCZ dwie wypowiedzi SELECT

Chcę aby mieć stół, który ma każdą osobę w tabeli, liczbę zadań, które mają, i liczbę zadań LATE, które mają (jeśli występują).

Mogę łatwo uzyskać te dane w oddzielnych tabelach, na przykład:

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

powracający dane jak:

ks  # Tasks 
person1 7 
person2 3 

a potem mam

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

która zwraca:

ks  # Late 
person1 1 
person2 1 

I chcę dołączyć wyniki tych dwóch wybranych wypowiedzi (przez KS)

próbuję Aby uniknąć używania tabeli tymczasowej, ale jeśli jest to jedyny praktyczny sposób, aby to zrobić, chciałbym wiedzieć więcej o używaniu tabel tymczasowych w ten sposób.

Próbowałem również wykonać pewnego rodzaju count() # wierszy, które spełniają warunkowe, ale nie mogłem dowiedzieć się, jak to zrobić. Jeśli to możliwe, to też by działało.

Uzupełnienie: Niestety, chcę mieć moje wyniki kolumn dla KS, zadania, a późniejsze

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

Dodatkowo chcę osoba, aby pokazać się, nawet jeśli nie mają zaległych zadań.

SUMA (SPRAWA KIEDY Wiek> Palt THEN 1 ELSE 0 END) Późno działa dobrze, dziękuję za tę odpowiedź!

Dwie instrukcje wyboru również działają, użycie LEWEGO DOŁĄCZENIA do nich również działa, a teraz rozumiem, jak dołączyć do wielu wyborów w ten sposób. Dzięki!

+0

Nie podałeś przykład oczekiwanego wyniku. Niektóre odpowiedzi są więc konkatenacyjne. Niektóre dołączają. Który chcesz? – Phil

+0

Niestety, chcę moje wyniki mają kolumny KS, zadania, a późniejsze KS # Zadania # Późno PERSON1 7 1 PERSON2 3 1 person3 2 0 (lub null) Dodatkowo chcę osobę, aby pokazać nawet jeśli nie mają opóźnionych zadań. Obecnie osiągnięciu tego za pomocą dwóch Wybierz metodę oświadczenie o LEFT JOIN (w przeciwieństwie do sugerowana INNER JOIN, który działa, ale nie pokazuje osób bez późnych zadań, ponieważ nie istnieje w drugim SELECT osiągnięcia także to z późną kolumną będącą SUMA (PRZYPADKU, GDY Wiek> Palt TO 1 ELSE 0 END) Późno – sylverfyre

Odpowiedz

167
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

To działa dobrze, chociaż nie określiłem, że chcę LEWEGO DOŁĄCZYĆ, tak aby rekordy pojawiały się, nawet jeśli mają 0 opóźnionych zadań – sylverfyre

+0

Zaakceptowałem tę odpowiedź, ponieważ odpowiada na pytanie, które zadałem najlepiej, i jest sformatowane jako doskonałe odniesienie do ŁĄCZENIA instrukcji SELECT :) – sylverfyre

41

Spróbuj czegoś takiego:

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 
+0

Nie mogłem uzyskać akceptowanej odpowiedzi do pracy, ale działało to doskonale na moje potrzeby. Dzięki. – benvenker

27

Zastosowanie 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 

Albo UNION ALL jeśli chcesz duplikaty:

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 
+0

W Unii lub Unii Wszystkie będą miały tylko 2 kolumny. Gdzie on chce 3 z nich – SurajS

11

Jeśli Wiek i Palt są kolumny w tej samej tabeli, można liczyć (*) wszystkie zadania i zsumuj tylko te późniejsze:

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

To jest dokładnie to, czego chciałem, ale nie wiedziałem, jak go szukać. Nie myślałem o używaniu SUMY (CASE) - dzięki. – sylverfyre

+0

Zapraszamy :-) –