Tim*_*ter 31 sql t-sql group-by sql-server-2005
我希望以下示例代码不言自明:
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
Run Code Online (Sandbox Code Playgroud)
结果:
T2ID T2Name Orders T1ID T1Name Price
1 aaa 25 2 BBB 350,00
2 bbb 35 3 CCC 100,00
Run Code Online (Sandbox Code Playgroud)
我需要的是上面评论,一种方法来获得,ROW_NUMBER但也是Group By首先.所以我需要在关系表中和在外部查询中按最高sum价格分组的所有T1 价格.T2.IDt1ID
换句话说:如何更改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
Run Code Online (Sandbox Code Playgroud)
注意:如果你想知道为什么我不会Orders与Price 相乘:它们不是realated(所以我应该离开这个专栏,因为它有点含糊不清,请忽略它,我只是添加它以减少所有抽象).实际上Orders必须保持不变,这就是子查询方法加入两者的原因以及我首先需要分组的原因.
结论:显然我的问题的核心可以通过可以应用于任何聚合函数的OVER条款来回答,例如(参见Damien的答案)对我来说什么是新的.谢谢大家的工作方法.SUM
Dam*_*ver 66
哇,其他答案看起来很复杂 - 所以我希望我没有错过任何明显的东西.
您可以使用OVER/ PARTITION BY反对聚合,然后他们将在没有GROUP BY子句的情况下进行分组/聚合.所以我只是将您的查询修改为:
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
,Rel.t1ID
-- ,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)OVER(PARTITION BY Rel.t2ID) 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
where t1Sum.PriceList = 1
Run Code Online (Sandbox Code Playgroud)
这给出了请求的结果集.
| 归档时间: |
|
| 查看次数: |
111930 次 |
| 最近记录: |