SQL中的条件连接取决于列值

时间:2017-06-06 20:25:09

标签: sql proc-sql

我正在尝试使用PROC-SQL在SAS表上进行连接。根据表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;

我需要加入才能创建variable1和variable2。我不想从表B中选择任何变量。

我的鳕鱼没跑。 SAS给了我一个错误信息,说它期待一个'结束。

是否有人知道如何根据列进行条件连接?

3 个答案:

答案 0 :(得分:1)

不要使用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,您需要考虑到这一点。另请注意,这是第一个条件的因素。

答案 1 :(得分:0)

如果这是错误的,那么不是PROC-SQL用户如此道歉,但基于this question,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;

答案 2 :(得分:0)

我会使用两个连接和一个合并语句:

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,但除非必须这样做。