我正在尝试使用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给了我一个错误信息,说它期待一个'结束。
是否有人知道如何根据列进行条件连接?
答案 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,但除非必须这样做。