是否可以在 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
我正在使用带左连接的 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