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

问题描述

我正在使用带有左连接的 SAS-Oracle Pass-Through 查询。是否可以在选择中使用 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,b.variable_new
);
disconnect from oracle;
quit;

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

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

select
 a.variable1,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,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 与聚合一起使用;它必须包含所有非聚合列。您的查询根本没有聚合任何内容,因此 - 而不是 GROUP BY,您可以 - 并且应该 - 使用 DISTINCT 代替:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...