【问题标题】:SAS Populate table with PROC SQL INSERT statement and do loopSAS 使用 PROC SQL INSERT 语句填充表并执行循环
【发布时间】:2014-12-16 17:46:12
【问题描述】:

这是一个流行病学项目。我想计算 1961 年至 2013 年间不同人群的疾病频率:所有年龄段的男性、50 岁以上的男性和同样的两个女性病例。

首先,我导入了一个名为“pop_compl”的人口表,其中包含上述时间跨度内男性(性别 = 1)和女性(性别 = 0,无冒犯)不同年龄段的人口数。

然后,我在 SAS 中使用 PROC SQL 创建了空表:

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 循环中使用插入语句来做到这一点。看起来像这样:

%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 位。目前,我不知道如何解决这个问题,也没有想出另一种快速的方法来解决这个问题。

【问题讨论】:

  • 您在 SAS 中使用 SQL 是因为您不了解 SAS,还是因为您认为这是最好的方法?对我来说,这似乎不太适合 SQL。数据步骤会容易得多。
  • 不推荐这样做的方法,也许张贴你所拥有的和你需要的。此论坛可能不适合此类问题,但您也可以在 community.sas.com 上发帖。
  • 我对 SAS 和 SQL 都有一定程度的了解 - 正如您所看到的,我离称自己为专业人士还差得很远。仍然在学习。我在 SAS 中使用 SQL,因为在这种情况下,首先将静态帧创建为空表并在之后填充它们似乎比在数据步骤中执行所有操作更方便。填满表格后,我将使用 UPDATE 语句使用简单的公式计算表格中的费率。我以前这样做过,所以至少我知道这是可行的。也许我应该再考虑一下其他方法。就像提出的答案一样......
  • 我已经从这个问题中删除了一张死图。看起来没有它仍然有意义,但请始终使用官方上传器,以便图像永久存在。谢谢!

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


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多