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

标签 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

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

最佳答案

您可以使用窗口函数 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

这假设销售类型“常规”至多有一行。

关于sql - 仅从同一表中的其他某些行中减去仅某些行的聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45744038/

相关文章:

mysql - 通过查询自动分配列

sql - 如何在 date_trunc 中添加整数变量

sql - 异步服务器,在等待回调时处理断开连接

sql-server - SQL Serve - 如何将 n 行分组到 xml 路径的子节点

sql-server - SQL 查询 - 与其他表连接的更新语句

java - 如果 DB2 中不存在表,则创建表

sql - 涉及成员时的简单 select 语句

sql - 在不使用唯一列或键列的情况下定义两个 SQL Server 表(父列到子列)之间的关系

sql - 获取单个查询中记录的计数百分比

sql-server - 获取两个表的连接的不同计数