Ich habe diesen Code, der die Menge für einen bestimmten Artikel ( itemid
) und den Produktdatumscode ( proddte
) zusammenfasst.
select sum(qty), itemid, proddte
from testtable where ....
group by itemid, proddte
Was ich tun möchte, ist, die Summe aller zu erhalten, qty
unabhängig davon itemid/proddte
. Ich habe versucht:
select sum(qty), itemid, proddte, sum(qty) over() as grandtotal
from testtable
where ....
group by itemid, proddte
Aber es heißt, ich sollte auch qty
in der group by
Klausel haben. Wenn ich das getan habe, entspricht das Ergebnis nicht meinem erwarteten Ergebnis.
Es muss nicht unbedingt als separate Spalte mit demselben Wert in jeder Zeile dargestellt werden. Jede Darstellung wird akzeptiert, solange ich die Gesamtsumme anzeigen kann.
quelle
GROUP BY ROLLUP((itemid,proddte))
würde das gleiche Ergebnis liefern und könnte weniger verwirrend sein.itemid
Ie enthält. Es ist äquivalent zuGROUP BY GROUPING SETS((),(itemid),(itemid,proddte))
GROUP BY ROLLUP(itemid,proddte)
Andererseits würde in der Tat (zusätzliche) Zwischensummen aufitemid
(wieGROUP BY ROLLUP((itemid),(proddte))
) erzeugt. Demo bei SEDEGROUP BY ROLLUP
weniger verwirrend, aber es ist eher subjektiv. Ich werde auch immer nervös, wenn ich Dinge lese wieThe non-ISO compliant WITH ROLLUP, WITH CUBE, and ALL syntax is deprecated
- warum ich dazu neige, zu bevorzugenGROUPING SETS
.Dies ist auch eine gültige Syntax:
Es ist etwas verwirrend, wenn man es zuerst sieht, aber man muss nur daran denken, dass die Fensterfunktionen - z. B.
sum() over ()
- nach dem angewendet werden,group by
damit alles, was in der Auswahlliste einer Gruppe nach Abfrage erscheinen kann, in einem Fensteraggregat platziert werden kann. Also (dasqty
kann aber nicht) dassum(qty)
kann drinnen platziert werdensum() over ()
:Trotzdem würde ich die
GROUPING SETS
Anfrage von Aaron Bertrand vorziehen . Die Gesamtsumme muss einmal und nicht in jeder Zeile angezeigt werden.Beachten Sie auch, dass die Summe der Summen zwar zur Berechnung der Gesamtsumme verwendet werden kann, Sie jedoch die Summe der Zählungen (und nicht die Anzahl der Zählungen!) Verwenden müssen, wenn Sie die Gesamtanzahl wünschen.
Und wenn man den Durchschnitt über die gesamte Tabelle hinweg haben möchte, wäre das noch komplizierter:
weil der Durchschnitt der Durchschnittswerte nicht der Durchschnitt aller ist. (Wenn Sie das versuchen, werden
avg(avg(qty)) over ()
Sie feststellen, dass es möglicherweise zu einem anderen Ergebnis als dem oben genannten Durchschnittswert führt.)quelle
Eine Möglichkeit, dies zu umgehen, besteht darin, den ersten
GROUP BY
in CTE zu verpacken :quelle