如何在 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
基本上假设我有这个数据集,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