Как сгруппировать по имени в PROC SQL для SAS (возвращает сообщение об ошибке) - PullRequest
0 голосов
/ 31 мая 2018

В основном, скажем, у меня есть этот набор данных, 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.

Как сгруппировать его, чтобы он выдавал желаемый результат?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я никогда не видел, чтобы 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
0 голосов
/ 31 мая 2018

Полностью определите имя столбца, используя синтаксис 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.

равнони с кем я не сталкивался раньше.Эти виды "что за звук?"ошибки могут возникать в сеансах SAS, в которых выполняется код с помощью шага DATA call execute или в сложном коде, сгенерированном макросами, включая нетипичное цитирование макросов.

Автор утверждает, что ошибка повторяется при перезапусках сеансов SASи в начале нового сеанса.Это важно, потому что существует небольшая вероятность того, что предыдущий код усложнит попытку запроса.

Особенность в том, что 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;
...