下面是我创建的一个表,用于解释我想做什么:
create table #test (
PlaceID int,
ItemID int,
ItemCount int,
Amount dec(11,2)
)我想得到三件事:
前两项很简单:
sum(Amount) over (partition by PlaceID) as PlaceAmount
sum(Amount) over (partition by PlaceID, ItemID) as PlaceItemAmount但是,我如何才能得到所有不是当前项目的项目的总和呢?
下面是一个设置了数据和查询的SQL Fiddle:
发布于 2014-05-27 20:26:54
select t1.PlaceID, t1.ItemID, t1.ItemCount
, t1.Amount as 'AmtMe'
, SumPlace.sum as 'AmtPlace'
, SumPlace.sum - t1.Amount as 'AmtPlaceNoMe'
from #test as t1
join (select PlaceID, sum(Amount) as 'sum'
from #test
group by PlaceID) as SumPlace
on t1.PlaceID = SumPlace.PlaceID 发布于 2014-05-27 20:28:00
这能达到你的预期吗?基本上,取整个(按位置划分)并减去当前(按位置、项划分)以获得剩余部分。但是,我要提到的是,将其保存在子查询中,以便每个函数和分区集只运行一次窗口聚合。
同样也可以用于计数,也可以使用这种逻辑。
select
PlaceID,
ItemID,
ItemCount,
Amount,
PlaceItemCount,
PlaceAmount,
ItemAndPlaceAmount,
PlaceAmount-ItemAndPlaceAmount as RemainderAmount
from (
select
PlaceID,
ItemID,
ItemCount,
Amount,
sum(ItemCount) over (partition by PlaceID) as PlaceItemCount,
sum(Amount) over (partition by PlaceID) as PlaceAmount,
sum(Amount) over (partition by PlaceID, ItemID) as ItemAndPlaceAmount
from tblTest
) z发布于 2014-05-27 22:15:09
SELECT
PlaceID,
ItemID,
ItemCount,
Amount,
sum(ItemCount) over (partition BY PlaceID) AS PlaceItemCount,
sum(Amount) over (partition BY PlaceID) AS PlaceAmount
, sum(Amount) over (partition BY PlaceID, ItemID) AS PlaceItemAmount
, sum(Amount) over (partition BY PlaceID)
- sum(Amount) over (partition BY PlaceID, ItemID) AS PlaceItemAmountMinusGroup
, sum(Amount) over (partition BY PlaceID) - Amount PlaceItemAmountMinusThis
FROM tblTestPlaceItemAmountMinusGroup是按地点计算的总额,但不包括ItemID总量。
PlaceItemAmountMinusThis是按位置计算的总金额,而不包括行的数量。
SQLFiddle演示
https://stackoverflow.com/questions/23898075
复制相似问题