首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在窗口函数的分区中进行筛选?

是否可以在窗口函数的分区中进行筛选?
EN

Stack Overflow用户
提问于 2014-05-27 20:12:47
回答 3查看 30关注 0票数 1

下面是我创建的一个表,用于解释我想做什么:

代码语言:javascript
复制
create table #test (
    PlaceID int, 
    ItemID int, 
    ItemCount int, 
    Amount dec(11,2)
)

我想得到三件事:

  1. 按地点分列的款项
  2. 按地点和项目分列的款项
  3. 按地点和非项目分列的款项

前两项很简单:

代码语言:javascript
复制
sum(Amount) over (partition by PlaceID) as PlaceAmount
sum(Amount) over (partition by PlaceID, ItemID) as PlaceItemAmount

但是,我如何才能得到所有不是当前项目的项目的总和呢?

下面是一个设置了数据和查询的SQL Fiddle

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-27 20:26:54

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2014-05-27 20:28:00

这能达到你的预期吗?基本上,取整个(按位置划分)并减去当前(按位置、项划分)以获得剩余部分。但是,我要提到的是,将其保存在子查询中,以便每个函数和分区集只运行一次窗口聚合。

同样也可以用于计数,也可以使用这种逻辑。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-05-27 22:15:09

代码语言:javascript
复制
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 tblTest

PlaceItemAmountMinusGroup是按地点计算的总额,但不包括ItemID总量。

PlaceItemAmountMinusThis是按位置计算的总金额,而不包括行的数量。

SQLFiddle演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23898075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档