仅从同一个表中的其他某些行中减去某些行的聚合?

时间:2017-08-17 20:01:18

标签: sql sql-server

product     saletype    qty
-----------------------------
product1    regular     10
product1    sale        1
product1    feature     2

我有一个如上所示的销售表,产品可以以3种不同方式中的一种出售(常规价格,促销价或特价)。

所有不论类型的销售都会累积成为常规销售,但销售和功能也会积累到他们自己的销售类型"也。所以在上面的例子中,我总共卖出了10个产品(7个常规,1个销售,2个功能)。

我希望尽可能有效地返回常规数量减去其他两列,以及其他销售类型。以下是我目前的工作方式:

create table query_test
(product varchar(20), saletype varchar(20), qty int);

insert into query_test values 
('product1','regular',10),
('product1','sale',1),
('product1','feature',2)

select
    qt.product,
    qt.saletype,
    CASE WHEN qt.saletype = 'regular' THEN sum(qt.qty)-sum(lj.qty) ELSE sum(qt.qty) END as [qty]
from
    query_test qt
    left join
    (
        select product, sum(qty) as [qty]
        from query_test
        where saletype in ('sale','feature')
        group by product
    ) lj on lj.product=qt.product
group by
    qt.product, qt.saletype;

......产生了我的目标:

product     saletype    qty
-----------------------------
product1    feature     2
product1    regular     7
product1    sale        1

但我觉得必须有一种比基本上两次查询相同信息更好的方法。

1 个答案:

答案 0 :(得分:2)

您可以使用窗口函数sum和一些算术来执行此操作。

select product,
saletype,
case when saletype='regular' then 2*qty-sum(qty) over(partition by product) 
else qty end as qty
from query_test

这假设销售类型最多只有一行'常规'。