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
但我觉得必须有一种比本质上查询相同信息两次更好的方法。
最佳答案
您可以使用窗口函数 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
这假设 saletype 'regular' 最多有一行。
关于sql - 从同一表中的其他某些行中减去仅某些行的聚合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45744038/