Utiliser OVER (PARTITION BY ) à la place du Groupe Par
droit maintenant, je suis à l'aide de la table temporaire dans ma requête sql, mais je veux utiliser la Partition En fonction de la place.
Mon temp requête création de table est donnée ci-dessous:
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;
J'obtiens le résultat escompté, mais je veux effectuer cette opération à l'aide de la fonction de Partition , j'ai essayé mais le résultat n'est pas exact -
select
NAME,
EMPID,
sum(Salary) over (partition by AmtPayer) as Total
from dbo.Candidate
De sortie est:
Vivek 0001 300.00 Vivek 0001 300.00 Vivek 0001 6200.00 Vivek 0001 6200.00 Vivek 0001 6200.00
Mais j'ai besoin de:
Vivek 0001 6200.00 300.00
Veuillez indenter votre code, de sorte qu'il apparaît que le code et de le formater avec un certain degré de bon sens... c'est vraiment dur de lire cela.
Si vous souhaitez que le résultat groupés, vous devez utiliser group by. L'objectif de l'utilisation des fonctions de la fenêtre n'est pas pas "réduire" le jeu de résultat.
double possible de Combiner plusieurs résultats dans une sous-requête dans un seul valeurs séparées par des virgules
Dans tous les cas, vous n'avez pas besoin d'une table temporaire. Recherche de quelque chose à propos de la
Si vous souhaitez que le résultat groupés, vous devez utiliser group by. L'objectif de l'utilisation des fonctions de la fenêtre n'est pas pas "réduire" le jeu de résultat.
double possible de Combiner plusieurs résultats dans une sous-requête dans un seul valeurs séparées par des virgules
Dans tous les cas, vous n'avez pas besoin d'une table temporaire. Recherche de quelque chose à propos de la
with
déclaration, ce qui permet de le faire, un groupe de plus d'un groupe par (qui aidera à résoudre votre problème).
OriginalL'auteur user3169167 | 2014-01-07
Vous devez vous connecter pour publier un commentaire.
De faire exactement ce que vous voulez, essayez cette:
Vous pouvez utiliser des cas énoncés dans les fonctions d'agrégation, ce qui vous permet de faire beaucoup de trucs de fou 🙂
Toutefois, comme indiqué dans mes commentaires à votre question, ce n'est utile que si vous avez un nombre fixe de AmtPayer variantes que vous savez à l'avance.
De développer plus:
partition by
est explicitement conçu pas pour réduire le jeu de résultats. Il reviendra encore une rangée par rangée, et il n'y a rien que vous pouvez faire pour changer cela - si vous ne souhaitez réduire le jeu de résultats, vous utilisezgroup by
à la place. Combiné avec tout le complexe des choses que vous pouvez faire avec les fonctions d'agrégation, c'est en fait un outil très puissant et qui s'applique à la foispartition by
etgroup by
. Notez également quepartition by
peut être beaucoup plus lent quegroup by
. En fait, j'ai trouvé que l'utilisation de la partition par pour obtenir le résultat compte (ie.count over (partition by NULL)
ou quelque chose de similaire) est beaucoup plus lent que de simplement faire deux requêtes, l'une pour le comte, et l'autre pour les résultats réels.Ne présumez pas que votre chemin est mieux car il a l'air plus intelligent toujours mesure. Le profilage est votre ami. Comme les systèmes de SQL Server sont en train de faire beaucoup d'optimisations qui essaient tout le temps de vous donner d'excellentes performances pour apparemment stupide requêtes 🙂
OriginalL'auteur Luaan
J'ai utilisé ci-dessous requête:
OriginalL'auteur user3169167