PostgreSQL - 基于列数据的减法简化查询

PostgreSQL - Subtraction based on column data simplifying query

我正在尝试根据代表其类别的另一列从 table 中减去数据。

例如:

+----+--------+----------+
| ID | Amount | Category |
+----+--------+----------+
| 1  |   100  |   Fish   |
+----+--------+----------+
| 2  |   200  |   Meat   |
+----+--------+----------+
| 3  |   300  |   Metal  |
+----+--------+----------+
| 4  |   400  |   Paper  |
+----+--------+----------+
| 5  |   500  |   Glass  |
+----+--------+----------+

我想用肉和鱼的数量减去玻璃的数量

我可以编写一个简单的查询来将数据相互减去,但我想知道是否有一种方法可以简化查询。

我写的代码:

create table calc(
    x int, 
    y int,
    z varchar
);

insert into calc values(1, 100, 'Fish');
insert into calc values(2, 200, 'Meat');
insert into calc values(3, 300, 'Metal');
insert into calc values(4, 400, 'Paper');
insert into calc values(5, 500, 'Glass');

select round(sum(y),2)
-(select round(sum(y),2) from calc where z = 'Fish')
-(select round(sum(y),2) from calc where z = 'Meat')
from calc
where z = 'Glass'

您可以只使用条件聚合:

select sum(case when z in ('Fish', 'Meat') then y
                when z in ('Glass') then - y
           end)
from calc
where z in ('Fish', 'Meat', 'Glass');

严格来说 where 子句不是必需的,但如果 z 的值很多,它可以提高查询的性能。