Du verkomplizierst die Dinge zu sehr. Sie müssen sich diesen beiden Abfragen nicht anschließen (und sollten sich wirklich von einem natürlichen fernhalten verbinden), müssen Sie sie nur kombinieren. min()
und max()
innerhalb derselben Abfrage verwendet werden können, müssen nicht zwei Abfragen ausgeführt werden, um beide auszuwerten.
Sie müssen CTE-Definitionen auch nicht verschachteln, Sie können einfach eine nach der anderen schreiben.
Also etwa so:
with quant_table as (
select month, prod, sum(quant) as sum_q
from sales
group by month, prod
), min_max as (
select month, max(sum_q) as max_q, min(sum_q) as min_q
from quant_table
group by month
)
select t1.*
from quant_table t1
join min_max t2
on t2.month = t1.month
and t1.sum_q in (t2.min_q, t2.max_q)
order by month, prod;
Die Bedingung and t1.sum_q in (t2.min_q, t2.max_q)
könnte auch geschrieben werden als and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q)
.
Das obige kann weiter vereinfacht werden, indem group by
kombiniert wird mit Fensterfunktionen
und führen Sie die Berechnung der Summe, des Minimums und des Maximums in einer einzigen Abfrage durch:
with min_max as (
select month, prod,
sum(quant) as sum_q,
max(sum(quant)) over (partition by month) as max_q,
min(sum(quant)) over (partition by month) as min_q
from sales
group by month, prod
)
select month, prod, sum_q
from min_max
where sum_q in (max_q, min_q)
order by month, prod;