У меня ситуация, как показано ниже (упрощенный запрос):
select split_part(field1,'_',1) as order_sign
, odp.dr_id
, sum(odp.use_count) as usecount
, cost
from table1
inner join table2 odp on .. = odp.dr_id
inner join .. = ..
...
where
condition1 AND condition2 AND ..
AND (split_part(field1,'_',1) in ('in', 'out'))
group by split_part(field1,'_',1), odp.dr_id, cost
order by odp.dr_id
У меня такой результат:
"in" ;8;1;70
"in" ;24;2;70
"out" ;27;1;70
"in" ;32;3;70
"in" ;38;2;70
"out" ;44;1;70
"in" ;52;3;70
"out" ;57;1;70
"in" ;58;1;70
"in" ;79;1;70
"out" ;79;2;70
"out" ;96;2;70
"out" ;114;1;70
"out" ;117;1;70
"out" ;124;2;70
"out" ;228;1;70
Как я мог использовать «вход» как «знак минуса», «выход» как «знак плюса», чтобы получить такой результат:
8 ; -1 ;70)
24 ; -2 ;70)
27 ; 1 ;70)
...
79 ; (-1+2); 70
...
228 ; 1; 70
Используете postgresql? Я хочу получить результат, используя только SQL.
спасибо, решено, просто прочтите еще немного :)
я решил, просто подумав больше)
with mycte as (
select split_part(field1,'_',1) as order_sign
, odp.dr_id
, sum(odp.use_count) as usecount
, cost
from table1
inner join table2 odp on .. = odp.dr_id
inner join .. = ..
...
where
condition1 AND condition2 AND ..
AND (split_part(field1,'_',1) in ('in', 'out'))
group by split_part(field1,'_',1), odp.dr_id, cost
order by odp.dr_id
)
select dr_id,
sum(
CASE
WHEN order_sign = 'in' then 0-usecount
ELSE usecount
END
) AS signed_usecount
,cost
from mycte
group by dr_id, cost
order by dr_id
Результат ожидаемый.
Нравится
CASE WHEN split_part(field1,'_',1) = 'in' THEN -1 ELSE 1 END * sum(odp.use_count) AS usecount
? Ваши желаемые результаты не соответствуют вашим образцам данных, поэтому я как бы предполагаю, что вы имеете в виду именно это.