Verwenden Sie OVER (PARTITION BY ) anstatt des Group By
Recht, jetzt bin ich mit temp-Tabelle in meiner sql-Abfrage, aber ich wollen, verwenden Sie die Partition, Von der Funktion statt.
Meine temp-Tabelle Abfrage wird unten gegeben:
drop table #Temp;
create table #Temp
(
NAME varchar(50),
EMPID varchar(50),
SS MONEY,
PP MONEY
);
insert into #Temp
select * From
(
select
p1.NAME,
p1.EMPID,
case when p1.AmtPayer = 'SELF' then sum(p1.Salary) else 0 end as S,
case when p1.AmtPayer = 'MANAGER' then sum(p1.Salary) else 0 end as P
from Candidate p1
group by p1.Name, p1.EMPID, p1.AmtPayer
) as P;
select
t.NAME,
t.EMPID,
sum(t.SS) as 'SELF PAID',
sum(t.PP) as 'PARTY PAID'
from #Temp t
group by t.NAME, t.EMPID;
Erhalte ich das erwartete Ergebnis als gut, aber ich möchte diesen Vorgang mithilfe von Partition-Funktion , ich habe versucht, aber Ergebnis ist nicht korrekt -
select
NAME,
EMPID,
sum(Salary) over (partition by AmtPayer) as Total
from dbo.Candidate
Ausgabe:
Vivek 0001 300.00 Vivek 0001 300.00 Vivek 0001 6200.00 Vivek 0001 6200.00 Vivek 0001 6200.00
Aber ich brauche:
Vivek 0001 6200.00 300.00
Bitte Einrücken, Ihren code so, dass er zeigt, wie code und formatieren Sie es mit irgendeinem Grad von Vernunft... es ist wirklich schwer zu Lesen.
Wenn Sie möchten, dass das Ergebnis gruppiert, müssen Sie der Gruppe durch. Der ganze Zweck der Fenster-Funktionen ist nicht nicht "reduzieren" in der Ergebnismenge.
möglich, Duplikat der Kombinieren Sie mehrere Ergebnisse in einer Unterabfrage, die in einem Komma-getrennten Wert
In jedem Fall brauchen Sie nicht eine temporäre Tabelle. Lookup etwas über die
Wenn Sie möchten, dass das Ergebnis gruppiert, müssen Sie der Gruppe durch. Der ganze Zweck der Fenster-Funktionen ist nicht nicht "reduzieren" in der Ergebnismenge.
möglich, Duplikat der Kombinieren Sie mehrere Ergebnisse in einer Unterabfrage, die in einem Komma-getrennten Wert
In jedem Fall brauchen Sie nicht eine temporäre Tabelle. Lookup etwas über die
with
- Anweisung, die Sie tun, um ein group by über die group by (das wird auch Ihr problem lösen).InformationsquelleAutor user3169167 | 2014-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau das zu tun, was Sie wollen, versuchen Sie dies:
Können Sie use-case-Anweisungen in der Aggregat-Funktionen, die es Ihnen ermöglicht, eine Menge verrückte Sachen 🙂
Jedoch, wie bereits in meinen Kommentaren zu deiner Frage, das ist nur sinnvoll, wenn Sie eine Feste Anzahl von AmtPayer Varianten, die Sie im Voraus wissen.
Mehr erarbeiten:
partition by
ist explizit darauf ausgelegt nicht um das Ergebnis zu reduzieren setzen. Es wird noch zurück, eine Zeile pro Zeile, und es gibt nichts, was Sie tun können, um das zu ändern - wenn Sie wollen, um das Ergebnis zu reduzieren-set, die Sie verwendengroup by
statt. Kombiniert mit all den komplexen Sachen, die Sie tun können, mit Aggregat-Funktionen, das ist eigentlich ein sehr mächtiges Werkzeug ist - und das gilt sowohl fürpartition by
undgroup by
. Beachten Sie auch, dasspartition by
kann sehr viel langsamer alsgroup by
. In der Tat, fand ich heraus, dass die Verwendung von partition zu bekommen Ergebnis count (ie.count over (partition by NULL)
oder etwas ähnliches) ist viel langsamer als die einfach mit zwei Abfragen, eine nur für den Grafen, und die andere für den tatsächlichen Ergebnissen.Nicht davon aus, dass Ihr Weg besser ist, weil es aussieht intelligenter - immer Messen. Profiling ist dein Freund. Systeme wie SQL-Server sind dabei eine Menge Optimierungen, die versuchen, alle die Zeit, um Ihnen große Leistung für die scheinbar dummen Fragen 🙂
InformationsquelleAutor Luaan
Ich unten-Abfrage:
InformationsquelleAutor user3169167