PostgreSQL - вычитание на основе данных столбца, упрощающее запрос - PullRequest
2 голосов
/ 25 мая 2019

Я пытаюсь вычесть данные из таблицы на основе другого столбца, представляющего их категорию.

Например:

+----+--------+----------+
| 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 Ответ

2 голосов
/ 25 мая 2019

Вы можете просто использовать условное агрегирование:

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, это может сделать запрос более производительным.

...