Группировать по предложению, используя поле как знак + -

У меня ситуация, как показано ниже (упрощенный запрос):

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.

Нравится CASE WHEN split_part(field1,'_',1) = 'in' THEN -1 ELSE 1 END * sum(odp.use_count) AS usecount? Ваши желаемые результаты не соответствуют вашим образцам данных, поэтому я как бы предполагаю, что вы имеете в виду именно это.

JNevill 26.09.2018 18:42

спасибо, решено, просто прочтите еще немного :)

Vova 26.09.2018 18:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

я решил, просто подумав больше)

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

Результат ожидаемый.

Другие вопросы по теме