如何在 PROC SQL for SAS 中按名称分组(returns 错误消息)

How to group by name in PROC SQL for SAS (returns error message)

基本上假设我有这个数据集,p1:

Name  Order_Value
John  5
John  11
John  7
Mark  5
Mark  7

我要输出这个结果:

 Name  Total_Spent
 John  23
 Mark  12

这是我尝试使用的代码:

PROC SQL;

SELECT name, SUM(order_value) AS Total_Spent
FROM p1
GROUP BY name;
QUIT;

它只是 returns 错误消息: 错误:对于查询中的所有行,NAME 关键字将具有常量值。 ORDER BY 或 GROUP BY 子句不支持它。

如何对其进行分组才能输出所需的结果?

使用语法 table-name.column

完全限定列名

@Tester_Y,错误信息

ERROR: The NAME keyword will have a constant value for all rows in a query.
It is not supported on the ORDER BY or GROUP BY clauses.

不是我以前遇到过的。这些类型的 'what the bleep?' 错误 可以 发生在 SAS 会话中,这些会话是 运行 通过数据步骤 call execute 编写的代码,或者发生在涉及非典型宏引用的复杂宏生成代码中.

发布者指出错误在 SAS 会话重新启动和新会话开始时重复table。这很重要,因为先前的代码几乎不可能使尝试的查询复杂化。

的特点是 name 不是 Proc SQL 中的保留字,并且代码没有显示错误的分号。无论如何,OP 示例代码和错误表明 Proc SQL 正在解析语句(在 Tester_Y 的会话中),因此它认为 NAME 是关键字。

Tester 的解决方案是使用语法 table-name.column 完全限定列名

以下示例代码具有与OP所述相同的错误,这让我认为测试人员的下一个可能嫌疑人是一些隐藏代码(autoexec/EG连接),编码问题、系统选项或平台相关问题。

data _null_;
  file "c:\temp\p1.txt";
  put "Name,Order_Value";
  put "John,5";
  put "John,11";
  put "John,7";
  put "Mark,5";
  put "Mark,7";
run;

proc import datafile='c:\temp\p1.txt' dbms=csv replace out=p1;
  getnames = yes;
run;

PROC SQL;
SELECT name, SUM(order_value) AS Total_Spent
FROM p1
GROUP BY name;
QUIT;


PROC SQL DQUOTE=ANSI;
SELECT "name", SUM(order_value) AS Total_Spent
FROM p1
GROUP BY "name";
QUIT;

我从未见过 SAS 对变量 NAME

这样做过
61    proc sql;
62     select name,sum(age)
63     from sashelp.class
64     group by name
65     ;
66     quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.10 seconds
      cpu time            0.07 seconds

但是有一些特定的变量名称,例如 USER 确实会引起麻烦。

67    proc sql;
68     select user,sum(age)
69     from sashelp.class(rename=(name=user))
70     group by user
71     ;
ERROR: The USER keyword will have a constant value for all rows in a query. It is not 
       supported on the ORDER BY or GROUP BY clauses.
72     quit;
NOTE: The SAS System stopped processing this step because of errors.

为引用添加别名前缀可以防止混淆。

73    proc sql;
74     select a.user,sum(age)
75     from sashelp.class(rename=(name=user)) a
76     group by a.user
77     ;
78     quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.03 seconds
      cpu time            0.03 seconds