【问题标题】:SAS - Group By not working due to case statement in SelectSAS - 由于 Select 中的 case 语句,Group By 无法工作
【发布时间】:2021-11-07 02:32:22
【问题描述】:

我遇到一个问题,即某些使用 PROC SQL 的 SAS 代码无法正常工作,因为我的一个计算中有一个 case 语句。

代码如下所示:

PROC SQL;
create table example as
select
a.var1,
a.var2,
a.var3,
case when a.NumericVariable is not missing then
Max(0,Sum(Sum(a.Var4), -Sum(a.Var5)))) end as Calculation
from table1 a inner join table2 b
on a.primarykey=b.primarykey
group by var1,var2,var3;
quit;

此代码返回表 A 中行数的重复行。 删除case语句如下:

PROC SQL;
create table example as
select
a.var1,
a.var2,
a.var3,
Max(0,Sum(Sum(a.Var4), -Sum(a.Var5)))) as Calculation
from table1 a inner join table2 b
on a.primarykey=b.primarykey
group by var1,var2,var3;
quit;

这只是使用 var1、var2 和 var3 的级别返回组。

如何调整上面的代码以去除重复?

【问题讨论】:

  • 我认为你遗漏了一些重要的东西——calculation 是什么。我试图在我的回答中解决这个问题,但如果它包含一个例子,你的问题会更好。特别是您可能正在使用sum 或其他既是汇总函数又是行级函数的函数,这会导致您的一些问题。
  • 我同意,如果任何变量被格式化并且您期望 SQL 支持格式,那么计算字段中的确切内容可能也很重要。这通常也是 SQL 中的一个大问题。

标签: sql sas


【解决方案1】:

这可以通过在摘要中执行case 语句 中解决。不过,这仅在可能可以这样做的情况下才有效 - 您可能需要重新编写查询才能使其成为可能。

如果您不能将case 语句放在摘要中,并且case 语句正在使用不在 group by 中的变量(并且不能放在在 group by 中),那么就不可能在这里做你想做的事情 - 你必须改变其他东西,也许预处理数据。

一个例子是,如果你只想在var6 没有丢失的情况下包含一个非零值,但在这种情况下你可以使用零,那么这很有效:

PROC SQL;
create table example as
select
a.var1,
a.var2,
a.var3,
max(0,sum(sum(case when a.var6 is not missing then a.var4 end),-(sum(case when a.var6 is not missing then a.var5 end)))) as Calculation
from table1 a inner join table2 b
on a.primarykey=b.primarykey
group by var1,var2,var3;
quit;

这是一个使用 sashelp.class 的示例:

proc sql;
  select max(0,sum(sum(case when age > 13 then height else 0 end),
               sum(case when age > 13 then weight else 0 end))
             )
    from sashelp.class
    group by sex;
quit;

【讨论】:

  • 您好,感谢您在这里的贡献。上面的计算不是变量,而是实际计算(特别是 Max(0,Sum(Sum(a.Var4), -Sum(a.Var5))))。我尝试了解决方案 1,但收到以下错误 ERROR: Summary functions nested in this way are not supported. 解决方案 2 也出现错误,因为将列字段编号添加到组中会产生以下错误。 ERROR: sqlplan internal error: Cannot find symbol Calculation, var=4, tag=0003. This message can be caused by attempting to make correlated references between two different items on a single FROM clause.
  • @thequadge 听起来解决方案 1 是正确的,但您不能将其嵌套在 sum 中 - 这不是要添加到您的计算中,我只是将其作为示例展示.
  • 非常感谢,以上解决了问题。非常感谢您的意见
【解决方案2】:

你没有使用任何聚合函数,那么只使用select distinct

create table example as
    select distinct a.var1, a.var2, a.var3,
           (case when a.NumericVariable is not missing then Calculation 
            end) as Calculation
    from table1 a inner join
         table2 b
         on a.primarykey = b.primarykey;

【讨论】:

  • 谢谢,这在我的示例中有效,这是很棒的新功能。我对如何在无法使用distinct 的其他情况下解决这个更广泛的问题感兴趣?
  • 戈登,我几乎可以肯定 OP 正在使用聚合函数,只是没有描述它(可能 calculation 不是一个字段,而是类似 sum(field1) ) - 否则 SAS 将不允许 @ 987654326@(它会将其转换为order by)并且上面的两个代码示例返回的行数相同。
  • @乔。 . .这回答了实际的问题。如果 OP 有不同的问题,我建议 OP 提出一个新问题。
  • @GordonLinoff 我认为您假设 calculation 表示变量 calculation - 显然不是,否则 SAS 不会返回有效结果(它不会执行所描述的操作)。在那方面,它将不同于我所知道的任何其他 SQL 实现。这是一个措辞不佳的问题,但它不是 this 问题。不管怎样,distinct 解决了这个问题——不过,通过隐藏真正的问题(并且可能产生不正确的结果,这取决于他们对计算的期望)。
  • 仅供参考 - OP 已更新以澄清 calculation 是实际计算。
猜你喜欢
  • 2021-04-03
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多