SQL GROUP BY CASE-Anweisung mit Aggregatfunktionen Funktion
-
05-07-2019 - |
Frage
Ich habe eine Spalte, die wie folgt aussieht:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
Und ich möchte es in meiner GROUP BY-Klausel, aber dies scheint Probleme zu verursachen, weil es ist eine Aggregat-Funktion in der Spalte.Gibt es eine Möglichkeit, die GRUPPE DURCH eine Spalte alias wie some_product
in diesem Fall, oder muss ich dies in einer Unterabfrage und eine Gruppe auf, die?
Lösung
Meine Vermutung ist, dass Sie nicht wirklich wollen, um GROUP BY
some_product.
Die Antwort: "Gibt es einen Weg GROUP BY
eine Spalte alias wie some_product in diesem Fall, oder muss ich dies in einer Unterabfrage und eine Gruppe auf das?" ist: Sie können nicht GROUP BY
eine Spalte alias.
Die SELECT
Klausel, wo Spalte Aliase zugewiesen sind, nicht verarbeitet, bis nach dem GROUP BY
Klausel.Eine inline-Ansicht oder common table expression (CTE) kann verwendet werden, um die Ergebnisse verfügbar für die Gruppierung.
Inline-Ansicht:
select ...
from (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
from ...
group by col1, col2 ... ) T
group by some_product ...
CTE:
with T as (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
from ...
group by col1, col2 ... )
select ...
from T
group by some_product ...
Andere Tipps
Während Shannon Antwort ist technisch korrekt, es sieht aus wie overkill.
Die einfache Lösung ist, die Sie benötigen, um Ihre Summierung außerhalb des case
Anweisung.Dies sollte den trick tun:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
Grundsätzlich, Ihren alten code sagt SQL zur Ausführung der sum(X*Y)
für jede Zeile einzeln (so dass jeder Zeile, mit Ihrer eigenen Antwort, die nicht gruppiert werden).
Die code-Zeile, die ich geschrieben habe, dauert die Summe Produkt, das ist, was Sie wollen.
Wenn Sie die Gruppierung, indem ein anderer Wert, anstelle von dem, was Sie haben,
schreiben Sie es als
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Wenn, otoh, Sie wollen group By
der innere Ausdruck, (col3*col4)
dann
schreiben Sie die group By
um mit dem Ausdruck übereinstimmen, w/o SUM
...
Select Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct
From ...
Group By Case When col1 > col2 Then col3*col4 Else 0 End
Schließlich, wenn Sie wollen, um die Gruppe Von dem eigentlichen Aggregat
Select SumSomeProduct, Count(*), <other aggregate functions>
From (Select <other columns you are grouping By>,
Sum(Case When col1 > col2
Then col3*col4 Else 0 End) as SumSomeProduct
From Table
Group By <Other Columns> ) As Z
Group by SumSomeProduct