Условное соединение в SQL в зависимости от значения столбца

Я пытаюсь выполнить соединение с таблицей SAS, используя PROC-SQL. В зависимости от значения одной переменной в таблице A мне нужно присоединиться, используя столбец, иначе мне нужно использовать другой столбец.

proc sql;
create table test
as select
A.*,
A.PPNG_RVNE * B.perc_ress as variable1,
A.P_RVNE    * B.perc_ress as variable2
from      tableA    as A
left join tableB    as B
on case when A.cod_cia = 1 then A.cod_cia=B.cod_cia and A.cod_agrup_produto=B.cod_agrup_produto 
                           else A.cod_cia=B.cod_cia and A.projeto=B.projeto;

Мне нужно присоединиться только для создания переменных1 и переменных2. Я не хочу выбирать какую-либо переменную из таблицы B.

Моя треска не работает. SAS выдает мне сообщение об ошибке, в котором говорится, что ожидается конец.

Кто-нибудь знает, как условное соединение в зависимости от столбцов?


person Rods2292    schedule 06.06.2017    source источник
comment
Итак, вы пытались добавить END ? В операторах CASE всегда требуется END.   -  person Tom    schedule 07.06.2017


Ответы (3)


Не используйте case. Просто выразите логику логически"

proc sql;
create table test as
    select A.*, A.PPNG_RVNE * B.perc_ress as variable1, A.P_RVNE    * B.perc_ress as variable2
    from tableA A left join
         tableB B
         on A.cod_cia = B.cod_cia and
            (A.cod_cia = 1 and A.cod_agrup_produto = B.cod_agrup_produto) or
            (A.cod_cia <> 1 and A.projeto = B.projeto);

Примечание. Здесь используется <> 1. Если cod_cia может быть NULL, вам нужно принять это во внимание. Также обратите внимание, что это учитывает первое условие.

person Gordon Linoff    schedule 06.06.2017

Не пользователь PROC-SQL, поэтому приносим свои извинения, если это неправильно, но на основе этот вопрос оператор case должен иметь следующий формат:

CASE
    WHEN ... THEN ...
    WHEN ... THEN ...
    ELSE ...
END

Итак, вы пробовали:

proc sql;
create table test
as select
A.*,
A.PPNG_RVNE * B.perc_ress as variable1,
A.P_RVNE    * B.perc_ress as variable2
from      tableA    as A
left join tableB    as B
on case when A.cod_cia = 1 then A.cod_cia=B.cod_cia and A.cod_agrup_produto=B.cod_agrup_produto 
        else A.cod_cia=B.cod_cia and A.projeto=B.projeto
   end;
person Luke Merrett    schedule 06.06.2017

Я бы использовал два объединения и оператор объединения:

proc sql;
create table test
as select
A.*,
A.PPNG_RVNE * coalesce(B1.perc_ress,B2.perc_ress) as variable1,
A.P_RVNE    * coalesce(B1.perc_ress,B2.perc_ress) as variable2
from      tableA    as A
left join tableB    as B1
    on A.cod_cia = 1 and A.cod_cia=B1.cod_cia and A.cod_agrup_produto=B1.cod_agrup_produto
left join tableB    as B2
    on  A.cod_cia=B2.cod_cia and A.projeto=B2.projeto;

вы можете добавить A.cod_cia ne 1 во второе соединение, но это не обязательно, если только.

person ALong    schedule 08.06.2017