SAS使用PROC SQL INSERT语句填充表并执行循环

时间:2014-12-16 17:46:12

标签: loops sas insert-into sas-macro proc-sql

这是一个流行病学项目。我想计算不同人群中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位。目前,我不知道如何解决这个问题,而且我没有提出另一种快速方法来做到这一点。

1 个答案:

答案 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;