【发布时间】:2012-03-25 22:24:09
【问题描述】:
我希望下面的示例代码是不言自明的:
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 的方法。所以我需要在关系表中按T2.ID 分组的所有T1 价格中的sum,在外部查询中需要最高价格的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 来回答,该OVER clause 可以应用于任何 聚合函数,如SUM(见Damien's answer ) 什么对我来说是新的。谢谢大家的工作方法。
【问题讨论】:
-
最终结果中不应该是
AAA而不是BBB吗?
标签: sql sql-server-2005 tsql group-by