【问题标题】:Filtering a numeric column name in SAS SQL在 SAS SQL 中过滤数字列名
【发布时间】:2022-10-13 04:08:55
【问题描述】:

我试图从表 temp_trans 中选择一个报告月份列,它看起来像:

GPNr  202112 202201 202202 .... 202208
x     1      5      2      .... 3
y     0.4    2      3      .... 8
z     3      1      5      .... 6



proc sql noprint;
  select distinct Berichtsmonat into :timeperiod1 - FROM work.Basis;

quit;

%put & timeperiod1

---> 202112

现在我试图在 202112 列上应用一个条件:

代码:

PROC SQL;
   CREATE TABLE WORK.QUERY_FOR_TEMP_TRANS_0000 AS
   SELECT t1.*
      FROM WORK.TEMP_TRANS t1
      WHERE t1.&timeperiod1 NOT = .;
QUIT;

我收到 t1.202112 的语法错误消息。 当我完成它时它会运行:t1.'202112'n not = .;

有什么线索可以解决这个问题吗? 提前致谢。

亲切的问候, 本

【问题讨论】:

  • 为什么(以及如何)最终以非标准变量名开头?如果您将 validvarname 选项设置为 V7,那么 SAS 将不允许您使用以数字开头的值作为变量的名称。

标签: sql arrays sas


【解决方案1】:

把宏变量放在里面双倍的引号并添加尾随 n 以使用名称文字语法。
单引号不会解析其中的宏变量,双引号会。

proc sql;
create table want as
    select t1.*
    from have t1
    where t1."&timeperiod."n ne .;
quit;

【讨论】:

    【解决方案2】:

    更改创建宏变量的方式,使其成为有效的 SAS 变量名称。 使用 NLITERAL 函数。

    proc sql noprint;
      select distinct nliteral(Berichtsmonat) into :timeperiod1 - FROM work.Basis;
    
    quit;
    
    %put & timeperiod1.;
    
    PROC SQL;
       CREATE TABLE WORK.QUERY_FOR_TEMP_TRANS_0000 AS
       SELECT t1.*
          FROM WORK.TEMP_TRANS t1
          WHERE t1.&timeperiod1 NOT = .;
    QUIT;
    

    【讨论】:

      【解决方案3】:

      谢谢大家,两种方法都行。谢谢。

      亲切的问候, 本

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2020-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多