Есть ли более чистый или простой способ добиться этого в SQL? - PullRequest
0 голосов
/ 23 марта 2020

Допустим, у меня есть таблица oracle, которая представляет простые банковские операции с этим определением:

create table mytable(id_operation varchar(11),
                     operation_type varchar2(11),
                     amount number);

Таблица содержит следующие данные:

ID_OPERATION    OPERATION_TYPE  AMOUNT
1                credit          200
2                credit          150

Для каждой операции i хочу также выбрать в запросе дебетовую версию, например, так:

ID_OPERATION    OPERATION_TYPE  AMOUNT
1C              credit           200
1D              debit           -200
2C              credit           150
2D              debit           -150

Вот что я пробовал:

select id_operation||'C' id_operation ,operation_type , amount
from mytable
union
select id_operation||'D' , 'debit', - amount
from mytable

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Вы можете использовать cross join:

select t.id_operation || x.suffix as id_operation,
       coalesce(x.operation_type, t.operation_type) as operation_type,
       (t.amount * x.mult) as amount
from mytable t cross join
     (select 'C' as suffix, null as operation_type, 1 as mult from dual union all
      select 'D' as suffix, 'debit' as operation_type, -1 as mult from dual
     ) x
1 голос
/ 23 марта 2020

Вы используете UNION, и это самый чистый способ достижения этого.

Кроме того, вы можете использовать CONNECT BY следующим образом:

SELECT
    ID_OPERATION || DECODE(LEVEL, 1, 'C', 'D') AS ID_OPERATION,
    DECODE(LEVEL, 1, OPERATION_TYPE, 'debit') AS OPERATION_TYPE,
    DECODE(LEVEL, 1, AMOUNT, - AMOUNT) AS AMOUNT
FROM MYTABLE
CONNECT BY LEVEL <= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...