espero siguiente ejemplo de código es autoexplicativo:¿Cómo combinar GROUP BY y 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
Resultado:
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 2 BBB 350,00
2 bbb 35 3 CCC 100,00
Lo que necesito es comentado anteriormente, una manera de conseguir la ROW_NUMBER
sino también a Group By
en el primer lugar. Entonces necesito el sum
de todos los precios T1 agrupados por T2.ID
en la tabla de relaciones y en la consulta externa el t1ID
con el precio más alto.
En otras palabras: ¿Cómo cambiar MAX(Rel.t1ID)AS t1ID
para devolver algo la identificación con el precio más alto?
Así que el resultado deseado es (nótese que la primera T1ID cambiado de 2 a 1, ya que tiene el precio más alto):
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 1 AAA 350,00
2 bbb 35 3 CCC 100,00
Nota: en caso de que se esté preguntando por qué no se multiplican Orders
con Precio: no están reajustados (así que debería haber dejado esta columna ya que es un poco ambigua, por favor ignórela, la acabo de agregar para que todo sea menos abstracto). En realidad, Orders
debe permanecer sin cambios, esa es la razón por la cual el enfoque de subconsulta se une a ambos y la razón por la que necesito agruparme en primer lugar.
Conclusión: es evidente que el núcleo de mi pregunta puede ser respondida por el OVER
clause que se puede aplicar a cualquier función agregada como SUM
(ver Damien's answer) lo que era nuevo para mí. Gracias a todos por sus enfoques de trabajo.
¿No debería ser 'AAA' en el resultado final en lugar de' BBB'? –