2012-05-10 10 views
98

Ist es möglich, die Ergebnisse von 2 SQL-SELECT-Anweisungen in einer Anweisung zu verbinden? Ich habe eine Datenbank von Aufgaben, wo jeder Datensatz eine separate Aufgabe ist, mit Fristen (und ein PALT, das ist nur ein INT von Tagen vom Start bis Deadline.JOIN zwei SELECT-Anweisung Ergebnisse

Ich möchte um eine Tabelle zu haben, die jede Person in der Tabelle hat, die Anzahl der Aufgaben, die sie haben, und die Anzahl der LATE Aufgaben, die sie haben (falls vorhanden).

Ich kann diese Daten in separaten Tabellen leicht erhalten, so:

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

Rückkehr Daten wie:

ks  # Tasks 
person1 7 
person2 3 

und dann habe ich

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

, die zurückgibt:

ks  # Late 
person1 1 
person2 1 

Und ich will die Ergebnisse dieser beiden select-Anweisungen verbinden (von der KS)

Ich versuche, Um zu vermeiden, eine temporäre Tabelle zu verwenden, aber wenn das der einzige praktische Weg ist, dies zu tun, würde ich gerne mehr über die Verwendung von temporären Tabellen auf diese Weise wissen.

Ich habe auch versucht, irgendeine Art von count() # von Zeilen, die eine bedingte erfüllen, aber ich konnte nicht herausfinden, wie dies auch tun. Wenn es möglich ist, würde das auch funktionieren.

Nachtrag: Sorry, ich möchte, dass meine Ergebnisse Spalten haben für KS, Aufgaben und Spät

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

Außerdem möchte ich eine Person sogar zeigen, wenn sie keine späte Aufgaben haben.

SUM (FALL WENN Alter> Palt DANN 1 ELS 0 ENDE) Spät funktioniert gut, danke für diese Antwort!

Zwei SELECT-Anweisungen funktionieren auch, die Verwendung eines LINKEN JOIN, um sie zu verbinden funktioniert auch, und ich verstehe jetzt, wie mehrere Auswahl auf diese Weise verbunden werden. Vielen Dank!

+0

Sie haben keine angegeben Beispiel für das erwartete Ergebnis. Einige Antworten sind daher verkettende Ergebnisse. Einige schließen sich an. Welchen willst du? – Phil

+0

Sorry, ich möchte, dass meine Ergebnisse Spalten haben für KS, Aufgaben und Spät KS # Aufgaben # Späte person1 7 1 person2 3 1 Person3 2 0 (oder null) Außerdem möchte ich eine Person zu zeigen, auch wenn sie keine späten Aufgaben haben. Das erreichen wir zur Zeit mit der SELECT-Anweisung mit einem LINKEN JOIN (im Gegensatz zu dem vorgeschlagenen INNER JOIN, der funktioniert, aber keine Personen ohne späte Aufgaben zeigt, weil sie nicht in der zweiten SELECT Auch erreichen dies mit der späte Spalte ist SUMME (FALL WENN Alter> Palt DANN 1 ELSE 0 END) Spät – sylverfyre

Antwort

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

Das funktioniert gut, obwohl ich nicht angegeben habe, dass ich einen LINKEN JOIN möchte, so dass Datensätze angezeigt werden, selbst wenn sie 0 späte Aufgaben haben – sylverfyre

+0

Akzeptiert diese Antwort, weil sie die Frage beantwortet, die ich am besten gestellt habe, und sie ist formatiert, um eine großartige Referenz auf JOINing SELECT-Anweisungen zu sein :) – sylverfyre

41

so etwas wie diese versuchen:

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

Ich konnte die akzeptierte Antwort nicht zur Arbeit bekommen, aber das funktionierte großartig für meine Bedürfnisse. Vielen Dank. – benvenker

27

Verwendung 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 

Oder UNION ALL wenn Sie Duplikate:

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

Union oder Union Alle haben nur 2 Spalten im Ergebnis. Wo, wie er will 3 von ihnen – SurajS

11

Wenn Alter und Palt Spalten in derselben Tabelle sind, können Sie (*) alle Aufgaben zählen und summe nur späte wie diese:

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

Das ist genau das, was ich wollte, aber wusste nicht, wie es aussehen. Ich habe nicht an einen SUM (CASE) gedacht - Danke. – sylverfyre

+0

Sie sind herzlich willkommen :-) –