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

时间:2019-05-25 18:50:59

标签: sql postgresql pgadmin

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

例如:

+----+--------+----------+
| 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'

1 个答案:

答案 0 :(得分:2)

您可以只使用条件聚合:

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的大量值,则可以使查询的性能更高。