这是一个流行病学项目。我想计算不同人群中1961年至2013年的疾病发病率:所有年龄段的男性,50岁以上的男性和女性的两个案例。
首先,我导入了一个名为'pop_compl'的人口表,其中包含了在上述时间跨度内男性(性别= 1)和女性(性别= 0,无进攻)的不同年龄组的人口数量。
然后,我使用PROC SQL在SAS中创建了空表:
proc sql;
create table m_rates (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
create table m_rates_50plus (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
create table w_rates (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
create table w_rates_50plus (year num(10), population num(10), cases num(10), crude_incidence num(10), esr num(10), esr_95CI_ll num(10), esr_95CI_ul num(10));
现在我想填写上面每个表(以及后来的第三个'案例')的前两列,年份和人口,以便能够在以后的表格中计算所需的费率。 列年份应填写值1961-2013,列人口与1961年至2013年之间每年“pop_compl”的相应人口数量。
我想通过在宏和do循环中使用insert语句来实现。看起来像这样:
%macro fill(table, sex, age_class);
insert into &table (year, population)
%do year=1961 %to 2013;
VALUES(&year, (select _&year from pop_compl where sex = &sex and age_class like "&age_class"))
%end;
;
%mend;
%fill(m_rates, 1, total);
%fill(m_rates_50plus, 1, > 50);
%fill(w_rates, 0, total);
%fill(w_rates_50plus, 0, > 50);
虽然看起来这在逻辑上是正确的,但是SAS抱怨在值语句中使用查询 - 摘录:
1037 %fill(m_rates_50plus, 1, > 50);
NOTE: No rows were updated in WORK.M_RATES_50PLUS.
NOTE: Line generated by the invoked macro "FILL".
3 VALUES(&year, (select _&year from pop_compl where sex = &sex and age_class like
-
22
76
3 ! "&age_class"))
ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
a numeric constant, a datetime constant, a missing value, ), +, ',', -, MISSING,
NULL, USER.
ERROR 76-322: Syntax error, statement will be ignored.
我尝试了几件事,更改了变量类型等等。没有任何帮助,我真的认为这是一个SAS SQL限制。我正在使用SAS 9.2 32位。目前,我不知道如何解决这个问题,而且我没有提出另一种快速方法来做到这一点。
答案 0 :(得分:1)
您只能在INSERT中使用SELECT语句,如下所示:
INSERT INTO TABLE1 (col1, col2) SELECT col1, col2 from TABLE2 WHERE ...
但不在VALUES子句中 - 必须有常量:
INSERT INTO TABLE1 (col1, col2) VALUES (123, 123)
您还可以创建临时表并将其附加到目标中:
PROC SQL; CREATE TABLE VAL1 AS SELECT ....;QUIT;
PROC APPEND DATA=VAL1 BASE=TABLE1;
RUN;