Сгруппировать по предложению, используя поле как знак + - - PullRequest
0 голосов
/ 26 сентября 2018

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

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

Как я могу использовать "в" как "знак минус", "out" как "знак плюс", чтобы получить результат как:

        8   ; -1 ;70)
        24  ; -2 ;70)
        27  ;  1 ;70)
        ...
        79  ;  (-1+2); 70
        ...
        228 ;  1; 70

Используя postgresql?Я хочу получить результат, используя только SQL.

1 Ответ

0 голосов
/ 26 сентября 2018

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

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

Результат, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...