Ersetzen Sie 2 SQL / ORACLE-Anfragen nur von einer Anforderung

Ich versuche, die Ergebnisse von zwei Anfragen innerhalb eines einzigen zu erhalten, diese beiden folgenden Anfragen sind funktional und jeder von ihnen führt zu einer Tabelle mit zwei Spalten:

SELECT patron.last_name, COUNT(*) AS **pret** FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id AND **circ_transaction_log.transaction_type<5** AND patron.college_or_school = 'High School' GROUP BY patron.last_name; 

last_name | pret
________________
steven grelle | 552
michelle vins | 122 …

_________________________ ODER _________________________

 SELECT patron.last_name, COUNT(*) AS **resa** FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id AND **circ_transaction_log.transaction_type BETWEEN 5 AND 10** AND patron.college_or_school = 'High School' GROUP BY patron.last_name; 

last_name | resa
________________
steven grelle | 12
michelle vins | 8

Das Ergebnis, das ich gerne bekommen möchte, ist so:

last_name | resa | pret
_______________________________
steven grelle | 552 | 12
michelle vins | 122 | 8

Aber ich denke, die Schwierigkeit ist, dass ich die gleiche Tabelle zweimal withe count (Tabelle CIRC_TRANSACTION_LOG) und was auch immer ich versuchte war oder in Fehler oder nicht funktioniert

Danke im Voraus für Ihre Antwort

Grüße, Nickk

Du bist doch so etwas wie damals:

 SELECT p.last_name, COUNT(case when ctl.transaction_type < 5 then 1 end) AS pret, count(case when ctl.transaction_type between 5 and 10 then 1 end) as resa FROM circ_transaction_log ctl INNER JOIN patron p ON (ctl.patron_id = p.patron_id) AND ctl.transaction_type <= 10 -- possibly not required if transaction_type is always <= 10 AND p.college_or_school = 'High School' GROUP BY p.last_name; 

NB. ungetestet, da Sie keine Beispieldaten für Ihre Tische angegeben haben.

Ich bevorzuge diese Methode. Wenn die Zeile mit Ihrer Bedingung übereinstimmt, setzen Sie 1 in die Spalte, wenn es nicht übereinstimmt, setzen Sie 0. Wenn Sie dann alle Werte addieren, gibt es Ihnen die Anzahl der Zeilen, die übereinstimmen. So können Sie verschiedene Summen für verschiedene Bedingungen erstellen.

 SELECT PatronCounts.last_name, SUM(PatronCounts.Pret) Pret, SUM(PatronCounts.Resa) Resa FROM (SELECT patron.last_name, CASE WHEN circ_transaction_log.transaction_type < 5 THEN 1 ELSE 0 END AS Pret, CASE WHEN circ_transaction_log.transaction_type BETWEEN 5 AND 10 THEN 1 ELSE 0 END AS Resa, FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id WHERE patron.college_or_school = 'High School' GROUP BY patron.last_name) PatronCounts 

Sie können Ihre Abfragen mit einem vollständigen äußeren Verknüpfung Ihrer Ergebnistabellen mit (last_name) kombinieren . Dies sollte das erwartete Ergebnis liefern. Versuchte, die Abfrage zu erstellen …

 Select * from (SELECT patron.last_name, COUNT(*) AS pret FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id AND circ_transaction_log.transaction_type<5 AND patron.college_or_school = 'High School' GROUP BY patron.last_name) FULL OUTER JOIN (SELECT patron.last_name, COUNT(*) AS resa FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id AND circ_transaction_log.transaction_type BETWEEN 5 AND 10 AND patron.college_or_school = 'High School' GROUP BY patron.last_name) USING (last_name) 

;