Spero seguente codice di esempio è auto-esplicativo:Come combinare GROUP BY e ROW_NUMBER?
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
Risultato:
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 2 BBB 350,00
2 bbb 35 3 CCC 100,00
cosa ho bisogno è commentata in precedenza, un modo per ottenere il ROW_NUMBER
ma anche per Group By
in primo luogo. Quindi ho bisogno dello sum
di tutti i prezzi T1 raggruppati per T2.ID
nella tabella delle relazioni e nella query esterna dello t1ID
con il prezzo più alto.
In altre parole: come cambiare MAX(Rel.t1ID)AS t1ID
in un po 'restituendo l'ID con il prezzo più alto?
Così il risultato desiderato è (si noti che prima T1ID cambiato 2-1 dal momento che ha il prezzo più elevato):
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 1 AAA 350,00
2 bbb 35 3 CCC 100,00
Nota: nel caso in cui vi state chiedendo il motivo per cui non si moltiplicano Orders
con Prezzo: non sono realizzati (quindi avrei dovuto lasciare questa colonna poiché è un po 'ambigua, per favore ignorala, l'ho appena aggiunta per rendere tutto meno astratto). In realtà, Orders
deve rimanere invariato, questo è il motivo per cui l'approccio di sub-query è associato a entrambi e il motivo per cui ho bisogno di raggruppare in primo luogo.
Conclusione: ovviamente il nucleo della mia questione può essere risolta dalla OVER
clause che può essere applicato a qualsiasi funzione di aggregazione come SUM
(vedi Damien's answer) ciò che era nuovo per me. Grazie a tutti per i vostri approcci lavorativi.
Non dovrebbe essere 'AAA' nel risultato finale invece di' BBB'? –