Надеюсь, следующий пример кода не требует пояснений:
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
Результат:
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 2 BBB 350,00
2 bbb 35 3 CCC 100,00
То, что мне нужно, прокомментировано выше, способ получить ROW_NUMBER
, но также и Group By
в первую очередь. Поэтому мне нужно sum
всех T1-цен, сгруппированных по T2.ID
в реляционной таблице, а во внешнем запросе t1ID
с самой высокой ценой.
Другими словами: как изменить MAX(Rel.t1ID)AS t1ID
на возвращение идентификатора с наивысшей ценой?
Итак, желаемый результат (обратите внимание, что первый T1ID изменился с 2 на 1, поскольку он имеет более высокую цену):
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 1 AAA 350,00
2 bbb 35 3 CCC 100,00
Примечание : в случае, если вам интересно, почему я не умножаю Orders
на цену: они не реализованы (поэтому я должен был опустить этот столбец, так как он немного неоднозначный, пожалуйста, игнорируйте это, я только добавил это, чтобы сделать все менее абстрактным). На самом деле Orders
должно остаться без изменений, поэтому подход с использованием подзапроса объединяет оба, а также причину, по которой мне нужно сгруппироваться в первую очередь.
Заключение : очевидно, на суть моего вопроса можно ответить предложением OVER
, которое можно применить к любой агрегатной функции, такой как SUM
(см. ответ Дэмиена ), что было для меня новым. Спасибо всем за ваши рабочие подходы.