Verbinden Sie zwei Ergebnisse der SELECT-Anweisung

174

Ist es möglich, die Ergebnisse von 2 SQL- SELECTAnweisungen in einer Anweisung zusammenzufassen? Ich habe eine Datenbank mit Aufgaben, in der jeder Datensatz eine separate Aufgabe mit Fristen ist (und eine PALT, die nur einige INTTage vom Start bis zum Stichtag Agebeträgt, ist auch eine INTAnzahl von Tagen.)

Ich möchte eine Tabelle haben, in der jede Person in der Tabelle, die Anzahl der Aufgaben und die Anzahl der LATEAufgaben (falls vorhanden) aufgeführt ist.

Ich kann diese Daten leicht in separaten Tabellen abrufen, wie folgt:

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

Rückgabe von 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

was zurückgibt:

ks        # Late
person1   1
person2   1

Und ich will die Ergebnisse dieser beiden verbinden selectAussagen (von der KS)

Ich versuche, die Verwendung einer temporären Tabelle zu vermeiden, aber wenn dies der einzig praktikable Weg ist, würde ich gerne mehr über die Verwendung temporärer Tabellen auf diese Weise erfahren.

Ich habe auch versucht, eine Art von count()Zeilen zu erstellen, die eine Bedingung erfüllen, aber ich konnte auch nicht herausfinden, wie das geht. Wenn es möglich ist, würde das auch funktionieren.

Nachtrag: Sorry, ich möchte , dass meine Ergebnisse Spalten haben für KS, TasksundLate

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

Außerdem möchte ich, dass eine Person auftaucht, auch wenn sie keine späten Aufgaben hat.

SUM(CASE WHEN Age > Palt THEN 1 ELSE 0 END) Late
funktioniert gut, danke für diese Antwort!

Zwei select-Anweisungen funktionieren ebenfalls, wobei das Verwenden LEFT JOINvon a ebenfalls funktioniert, und ich verstehe jetzt, wie mehrere selects auf diese Weise verbunden werden

Sylverfyre
quelle
Sie haben kein Beispiel für das erwartete Ergebnis angegeben. Einige Antworten verketten daher die Ergebnisse. Einige schließen sich an. Welches willst du?
Phil
Entschuldigung, ich möchte, dass meine Ergebnisse Spalten für KS, Aufgaben und späte KS enthalten. # Aufgaben # Späte Person1 7 1 Person2 3 1 Person3 2 0 (oder null) Außerdem möchte ich, dass eine Person angezeigt wird, auch wenn sie keine späten Aufgaben hat . Dies wird derzeit mithilfe der Methode mit zwei ausgewählten Anweisungen mit einem LEFT JOIN erreicht (im Gegensatz zum vorgeschlagenen INNER JOIN, der funktioniert, jedoch keine Personen ohne späte Aufgaben anzeigt, da diese im zweiten SELECT nicht vorhanden sind. Dies wird auch mit dem späten erreicht Spalte ist SUMME (FALL WENN Alter> Palt DANN 1 SONST 0 ENDE) Late
Sylverfyre

Antworten:

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);
Phil
quelle
1
Dies funktioniert gut, obwohl ich nicht angegeben habe, dass ich einen LEFT JOIN möchte, damit Datensätze angezeigt werden, auch wenn sie 0 späte Aufgaben haben.
Sylverfyre
Akzeptierte diese Antwort, weil sie die Frage beantwortet, die ich am besten gestellt habe, und sie ist so formatiert, dass sie eine großartige Referenz für die Teilnahme an SELECT-Anweisungen darstellt :)
sylverfyre
Ausgezeichnete Antwort, aber kann jemand sagen, ob diese Art von "Lösung" als teuer angesehen wird oder nur davon abhängt, wofür Sie sie verwenden?
Petrosmm
71

Versuchen Sie so etwas:

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
Mithrandir
quelle
4
Ich konnte die akzeptierte Antwort nicht auf die Arbeit bekommen, aber das funktionierte großartig für meine Bedürfnisse. Vielen Dank.
Benvenker
Lief wie am Schnürchen. Für mich sollte dies die akzeptierte Antwort sein. Vielen Dank.
Nocdib
Hat für mich gearbeitet! Vielen Dank! Ich habe auch versucht, mehrere Abfragen (mehrere Joins) zu verwenden, und es funktioniert auch hervorragend. Wenn sich jemand wundert, können Sie nach dem letzten "ON" im Beispiel einfach weitere JOINs hinzufügen und weiterhin die folgende Sequenz verwenden: ON .... X JOIN (QUERY N -1) ON Y = ZX JOIN (QUERY N) ON Y. = Z
cesarmart
43

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 ALLwenn Sie Duplikate möchten:

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
aF.
quelle
3
Union oder Union Alle haben nur 2 Spalten im Ergebnis. Wo er will 3 von ihnen
SurajS
14

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

select ks,
       count(*) tasks,
       sum(case when Age > Palt then 1 end) late
  from Table
 group by ks
Nikola Markovinović
quelle
1
Dies ist genau das, was ich wollte, wusste aber nicht, wie ich danach suchen sollte. Ich habe nicht daran gedacht, eine SUMME (FALL) zu verwenden - danke.
Sylverfyre