问题:用SQL进行分组时计算行间差异

我有一个 postgresql 表,其中包含仓库之间不同项目(模型)的移动。

例如,以下记录表示已将 5 台型号 1 从仓库 1 发送到仓库 2:

source target model units
------ ------ ----- -----
     1      2     1     5

我正在尝试构建一个 SQL 查询,以获取按模型分组的发送和接收单位之间的差异。再举个例子:

source target model units
------ ------ ----- -----
     1      2     1     5  -- 5 sent from 1 to 2
     1      2     2     1
     2      1     1     2  -- 2 sent from 2 to 1
     2      1     1     1  -- 1 more sent from 2 to 1

结果应该是:

source target model diff
------ ------ ----- ----
     1      2     1    2   -- 5 sent minus 3 received
     1      2     2    1

我想知道这是否可能使用单个 SQL 查询

这是表创建脚本和一些数据,以防万一有人想尝试:

CREATE TEMP TABLE movements
(
    source  INTEGER,
    target  INTEGER,
    model   INTEGER,
    units   INTEGER
);

insert into movements values (1,2,1,5);
insert into movements values (1,2,2,1);
insert into movements values (2,1,1,2);
insert into movements values (2,1,1,1);

解答

这能满足您的需要吗?我没有要测试的 Oracle DB,所以我希望分组表达式的规则与 MS SQL Server 的规则相同

SELECT     
 CASE WHEN source < target THEN source ELSE target END AS source,
 CASE WHEN source < target THEN target ELSE source END AS target,
 SUM(CASE WHEN source < target THEN units ELSE -units END) AS Diff, 
    model
FROM  movements
GROUP BY
 CASE WHEN source < target THEN source ELSE target END,
 CASE WHEN source < target THEN target ELSE source END,
    model
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐