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

如何在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

基本上,假设我有这个数据集,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;
它只返回错误消息: 错误:对于查询中的所有行,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大学版,但我猜不是这样。感谢您的详细回复——我只是感到困惑,因为我一辈子都不明白为什么代码不能正常工作。