错误:列xxx引用的值表达式不能在Proc SQL set语句中直接包含汇总函数

Posted

技术标签:

【中文标题】错误:列xxx引用的值表达式不能在Proc SQL set语句中直接包含汇总函数【英文标题】:ERROR: The value expression referenced by column xxx can not directly contain a summary function in Proc SQL set statement 【发布时间】:2020-09-20 15:23:48 【问题描述】:

我想要在现有表中添加一列,以根据国家和日期比较个别国家/地区 new_casesglobal_average_new_cases 以了解 COVID 演变。

而且我希望结果是一个二进制值,这意味着,如果某个特定日期的个别国家新病例大于同一日期的全球平均新病例,那么它将返回 1,否则它将返回返回 0。

我只能使用 Proc SQL 编写代码来实现这样的结果。

我尝试了以下方法:

proc sql;

alter table devoirb.covid_data

add compare_global_average num(7);

update devoirb.covid_data

set 

compare_global_average =

case when nouveaux_cas > avg(nouveaux_cas) then 1 else 0
end;

quit;

并且,当我运行此代码时,它会返回以下错误消息:

错误:compare_global_average 列引用的值表达式不能直接包含汇总函数。

根据我的理解,此错误消息意味着当我想为 compare_global_average 列赋值时,我无法在 set 语句中使用 avg 函数。

谁能帮我解决这个问题?有没有其他方法可以编写这样的代码来尝试我在 Proc SQL 中的期望?

【问题讨论】:

【参考方案1】:

在这种情况下你需要一个子查询:

update devoirb.covid_data
    set compare_global_average = (case when nouveaux_cas > (select avg(nouveaux_cas) from devoirb.covid_data)
                                       then 1 else 0
                                   end);
quit;

【讨论】:

我已经尝试过您的代码,但它返回给我另一个错误,请参见下面的 cmets 警告:SET 子句的值表达式引用了正在更新的数据集。错误:您无法通过成员级控制重新打开 DEVOIRB.COVID_DATA.DATA 以进行更新访问,因为您在资源环境 SQL (2) 中正在使用 DEVOIRB.COVID_DATA.DATA。错误:如果发生错误,PROC SQL 无法撤消此语句,因为它无法获得对数据集的独占访问权限。此语句不会执行,因为 SQL 选项 UNDO_POLICY=REQUIRED 有效。 @Heng . . .我没有意识到 SAS 有这个限制。这意味着您可能需要将结果存储在临时表中。 谢谢你的帮助,你的意思是我会创建一个临时表,然后将两个表连接在一起吗? @Heng . . .是的。临时表只有平均值。您还可以创建一个视图来动态计算值。 我会这样做。非常感谢您的帮助!

以上是关于错误:列xxx引用的值表达式不能在Proc SQL set语句中直接包含汇总函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL UPDATE SET 一列等于另一列引用的相关表中的值?

SQL语句中,子句不能使用列别名问题

为啥我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表

SQL SELECT 不能引用“INDEX”列

inode 列 (proc/net/tcp(6)) 中的值是啥意思?

更改 SQL Server 2008 中在表的计算列中引用的标量函数