【问题标题】:Conditional join in SQL depending on a column valueSQL中的条件连接取决于列值
【发布时间】:2017-06-06 20:25:09
【问题描述】:

我正在尝试使用 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;

我需要加入只是为了创建变量 1 和变量 2。我不想从表 B 中选择任何变量。

我的鳕鱼没有跑。 SAS 给我一条错误消息,说它正在等待一个“结束”。

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

【问题讨论】:

  • 那么您是否尝试添加 END ? CASE 语句总是需要 END。

标签: sql proc-sql


【解决方案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);

注意:这里使用&lt;&gt; 1。如果cod_cia 可能是NULL,您需要考虑到这一点。另请注意,这会排除第一个条件。

【讨论】:

    【解决方案2】:

    不是 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;
    

    【讨论】:

      【解决方案3】:

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

      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,但除非没有必要。

      【讨论】:

        猜你喜欢
        • 2016-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 2018-08-07
        相关资源
        最近更新 更多