如何在PROC SQL for SAS中按名称分组(返回错误消息)
基本上,假设我有这个数据集,p1:如何在PROC SQL for SAS中按名称分组(返回错误消息),sql,group-by,sas,type-conversion,proc-sql,Sql,Group By,Sas,Type Conversion,Proc Sql,基本上,假设我有这个数据集,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; 它只返回错误消息: 错误:对于查询中的所有行,N
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;
它只返回错误消息:
错误:对于查询中的所有行,NAME关键字将具有常量值。ORDER BY或GROUP BY子句不支持它
如何将其分组,以便输出所需的结果?使用语法table-name.column完全限定列名 @检测仪_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.
这不是我以前遇到过的。在SAS会话中,通过数据步骤call execute
运行代码时,或在涉及非典型宏引用的复杂宏生成代码中,可能会发生此类“what the bleep?”错误
海报指出,该错误可在SAS会话重新启动和新会话开始时重复出现。这一点很重要,因为之前的代码很少会使尝试的查询复杂化
其特点是name
在Proc-SQL
中不是保留字,并且代码不会显示错误的分号。无论如何,OP示例代码和错误表明Proc SQL
正在解析语句(在测试人员的会话中),因此它认为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;
使用语法table-name.column完全限定列名 @检测仪_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.
这不是我以前遇到过的。在SAS会话中,通过数据步骤call execute
运行代码时,或在涉及非典型宏引用的复杂宏生成代码中,可能会发生此类“what the bleep?”错误
海报指出,该错误可在SAS会话重新启动和新会话开始时重复出现。这一点很重要,因为之前的代码很少会使尝试的查询复杂化
其特点是name
在Proc-SQL
中不是保留字,并且代码不会显示错误的分号。无论如何,OP示例代码和错误表明Proc SQL
正在解析语句(在测试人员的会话中),因此它认为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
我从未见过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
查询没有问题,因此必须是操作环境。如果重新启动SAS,消息是否继续显示?在实际代码之前和之后还有哪些其他数据或过程步骤?谢谢您的回复。我只是将其作为CSV文件导入。使用此代码proc import datafile=practice out=p1 dbms=csv replace;getnames=YES;跑这是我程序中唯一的代码。进口可能有问题吗?(我使用filename将导入目录最小化为“practice”)。当我选择*时,它会正常填充。编辑3:是的,重新启动SAS,同样的问题。如果使用
p1.name
而不是name
,会发生什么情况呢?我可能会养成在引用列时指定数据集的习惯。谢谢:)!查询没有问题,因此它必须是操作环境。如果重新启动SAS,消息是否会继续显示?实际代码中的前后还有哪些其他数据或过程步骤?感谢您的回复。我只是将其作为CSV文件导入。使用此代码proc import datafile=practice out=p1 dbms=CSV replace;getnames=YES;run;这是我在程序中仅有的代码。导入是否有问题?(我使用filename将导入目录最小化为“practice”)。当我选择*时,它会正常填充。编辑3:是的,重新启动SAS,同样的问题。如果使用p1.name
而不是name
,会发生什么!我应该养成在引用列时指定数据集的习惯。谢谢:)!PROC SQL和ANSI标准-讨论保留字(9.2文档),感谢链接<代码>名称在该文档中未作为保留字提及。PROC SQL和ANSI标准-讨论保留字(9.2文档)感谢链接<代码>名称在该文档中未作为保留字提及。有道理!我想这可能是因为我使用的是SAS大学版,但我猜不是这样。感谢您的详细回复——我只是感到困惑,因为我一辈子都搞不明白为什么代码不能正常工作。这是有道理的!我想这可能是因为我使用的是SAS大学版,但我猜不是这样。感谢您的详细回复——我只是感到困惑,因为我一辈子都不明白为什么代码不能正常工作。