我希望下面的示例代碼是不言自明:如何結合GROUP BY和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
結果:
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
有點返回最高價格的ID?
所以期望的結果是(注意:第一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
clause回答是可以應用到任何總之類的函數SUM
(見Damien's answer)什麼新的我。謝謝大家的工作方法。
不應該在最終結果而不是'BBB'而不是'BBB'? – 2012-03-08 12:41:01