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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top