是否可以在 sas oracle 传递中使用 CASE 表达式?

Is it possible to use CASE expressions in a sas oracle pass-through?

我正在使用带左连接的 SAS-Oracle 直通查询。是否可以在 select 中使用 CASE 语句? 举个例子:

proc sql;
connect to oracle (user=&user. password=&password. buffsize=1000 path=XXX);
create table
lib.test
as select
*
from connection to oracle (
select
 a.variable1
,a.variable2
,a.variable3
,b.variable4
,case when b.variable5 = 'K' and b.variable6 < b.variable7 then b.variable6 else . end as variable_new
from table1 a
left join table2 b
on
a.id=b.id
where 
a.variable5 = 'X'
group by
a.variable1, a.variable2, a.variable2, b.variable4, b.variable_new
);
disconnect from oracle;
quit;

如果没有带 case 语句的代码行,代码 运行 是没有问题的。所以我认为必须改变一些东西。 这里可以使用case表达式吗?还是有另一种方法可以做到这一点? 非常感谢任何帮助!

感谢您到目前为止的帮助!正如我在评论中提到的,我现在可以通过将 case 语句也添加到 group by 来 运行 我的代码。 我现在的新问题是:我有几个案例陈述,因此为我的数据集创建了几个新列。因为我必须在 group by 语句中包含所有变量(不是总和、计数等),所以我将所有 case 语句添加到 group by 中。但是现在线路加倍了,这是我不想要的。 例如

select
 a.variable1
,a.variable2
,a.variable3
,b.variable4
,case when b.variable5 = 'K' and b.variable6 < b.variable7 then b.variable6 end as variable_new
,case when b.variable5 = 'K' and b.variable8 >= b.variable9 then b.variable6 end as variable_new_2
from table1 a
left join table2 b
on
a.id=b.id
where 
a.variable5 = 'X'
group by
a.variable1, a.variable2, a.variable2, b.variable4
,case when b.variable5 = 'K' and b.variable6 < b.variable7 then b.variable6 end
,case when b.variable5 = 'K' and b.variable8 >= b.variable9 then b.variable8 end 
);
disconnect from oracle;

结果的形式是

 variable1  variable2  variable3 variable4  variable_new  variable_new_2
1                                            variable6    .
1                                               .           variable8 

而不是像这样只有一行

 variable1  variable2  variable3 variable4  variable_new  variable_new_2
1                                            variable6      variable8 

我怎样才能像那样对数据进行分组?

我不知道是否可以在您使用的内容中使用CASE

但是,你的似乎有点无效(至少对我而言)。

case 
  when b.variable5 = 'K' and b.variable6 < b.variable7 then b.variable6 
  else .               --> here
end as variable_new

else .?那是什么?如果你不知道“其他”该怎么做,那就

case 
  when b.variable5 = 'K' and b.variable6 < b.variable7 then b.variable6 
end as variable_new

看看有没有帮助。


截至 GROUP BY 期:

GROUP BY 与聚合一起使用;它必须包含所有非聚合列。您的查询根本不聚合任何内容,因此 - 您可以 - 并且应该 - 使用 DISTINCT 而不是 GROUP BY

select DISTINCT        --> DISTINCT here
 a.variable1
,a.variable2
,a.variable3
,b.variable4
,case when ...
from ...
where 
a.variable5 = 'X'
                       --> no GROUP BY here!

使用句点表示缺失值是 SAS 语法。在 Oracle 中,您可能希望改用关键字 NULL。

,case when b.variable5 = 'K' and b.variable6 < b.variable7 then b.variable6
      else null
 end as variable_new