Comment combiner GROUPE PAR et ROW_NUMBER?
J'espère exemple de code suivant est auto-explicatif:
declare @t1 table (ID int,Price money, Name varchar(10))
declare @t2 table (ID int,Orders int, Name varchar(10))
declare @relation table (t1ID int,t2ID int)
insert into @t1 values(1, 200, 'AAA');
insert into @t1 values(2, 150, 'BBB');
insert into @t1 values(3, 100, 'CCC');
insert into @t2 values(1,25,'aaa');
insert into @t2 values(2,35,'bbb');
insert into @relation values(1,1);
insert into @relation values(2,1);
insert into @relation values(3,2);
select T2.ID AS T2ID
,T2.Name as T2Name
,T2.Orders
,T1.ID AS T1ID
,T1.Name As T1Name
,T1Sum.Price
FROM @t2 T2
INNER JOIN (
SELECT Rel.t2ID
,MAX(Rel.t1ID)AS t1ID
-- the MAX returns an arbitrary ID, what i need is:
-- ,ROW_NUMBER()OVER(Partition By Rel.t2ID Order By Price DESC)As PriceList
,SUM(Price)AS Price
FROM @t1 T1
INNER JOIN @relation Rel ON Rel.t1ID=T1.ID
GROUP BY Rel.t2ID
)AS T1Sum ON T1Sum.t2ID = T2.ID
INNER JOIN @t1 T1 ON T1Sum.t1ID=T1.ID
Résultat:
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 2 BBB 350,00
2 bbb 35 3 CCC 100,00
Ce dont j'ai besoin est commenté ci-dessus, un moyen d'obtenir le ROW_NUMBER
mais aussi à Group By
en premier lieu. J'ai donc besoin de la sum
de tous les T1-prix regroupées par T2.ID
dans la relation-table et dans la requête externe de la t1ID
avec le prix le plus élevé.
En d'autres termes: Comment faire pour modifier MAX(Rel.t1ID)AS t1ID
à un peu de retourner l'ID avec le prix le plus élevé?
De sorte que le résultat souhaité est(notez que tout d'abord T1ID changé de 2 à 1, puisqu'il a le prix le plus élevé):
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 1 AAA 350,00
2 bbb 35 3 CCC 100,00
Note: dans le cas où vous vous demandez pourquoi je ne multipliez pas Orders
avec les Prix: ils ne sont pas liée(donc je devrais avoir laissé cette colonne, car il est un peu ambigu, veuillez l'ignorer, j'ai juste ajouté ça à faire tous les moins abstraite). En fait Orders
doit rester inchangé, c'est la raison pour laquelle la sous-requête approche à joindre les deux et la raison pour laquelle j'ai besoin de group by dans la première place.
Conclusion: évidemment, le cœur de ma question peut être répondu par la SUR
l'article qui peut être appliquée à tout fonction d'agrégation comme SUM
(voir Damien réponse) ce qui était nouveau pour moi. Merci à tous pour vos méthodes de travail.
- Ne pourrait-il pas être
AAA
dans le résultat final, au lieu deBBB
?
Vous devez vous connecter pour publier un commentaire.
Wow, les autres réponses paraître complexe - donc je suis en espérant que je n'ai pas raté quelque chose d'évident.
Vous pouvez utiliser
OVER
/PARTITION BY
contre les agrégats, et ils vont ensuite faire de regroupement/agrégation sansGROUP BY
clause. Alors j'ai juste modifié la requête:Qui donne le résultat voulu définir.
Sans doute cela peut être simplifié, mais les résultats correspondent à vos attentes.
L'essentiel de ce qui est à
CTE
pour chaquet2ID
CTE
pour chaquet2ID
CTE
'sInstruction SQL
La déduplication (pour sélectionner le max T1) et de l'agrégation doivent être faites comme des étapes distinctes. J'ai utilisé un CTE, car je pense que cela le rend plus clair: