2014-12-16 5 views
0

Это для эпидемиологического проекта. Я хотел рассчитать частоту заболеваемости в период с 1961 по 2013 год среди разных групп населения: мужчин всех возрастов, мужчин старше 50 лет и тех же двух случаев для женщин.SAS Заполнение таблицы с помощью инструкции PROC SQL INSERT и цикла do

Во-первых, я импортировал таблицу населения, названную «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 гг., Численность столбцов с соответствующими числами населения от «pop_compl» за каждый год между 1961 и 2013 годами.

Я хотел сделать это, используя инструкцию insert в пределах макро и цикл 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 32bit. На данный момент я не знаю, как это исправить, и я не придумал другой быстрый метод, который делает то же самое.

+2

Используете ли вы SQL в SAS, потому что вы не знаете SAS, или вы делаете это, потому что y Вы думаете, что это лучший подход здесь? Это не похоже на то, что мне хорошо подходит для SQL. Шаг данных будет намного проще. – Joe

+0

Не рекомендуемый способ сделать это, возможно, опубликовать то, что у вас есть, и то, что вам нужно. Этот форум может и не соответствовать этому типу вопросов, но вы можете публиковать сообщения на community.sas.com. – Reeza

+0

Я знаю как SAS, так и SQL в определенной степени - как вы можете видеть, я далеко не называю себя профессионалом. Все еще учусь. Я использую SQL в SAS, потому что в этом случае мне было удобнее сначала создавать статические кадры как пустые таблицы и заполнять их, чем делать все на шаге данных. После заполнения таблиц я буду использовать инструкцию UPDATE для вычисления ставок в таблицах с использованием простых формул. Я сделал это раньше, так что, по крайней мере, я знаю, что это работает. Может быть, я еще раз подумаю о других методах. Как и тот, который предлагается в качестве ответа ... –

ответ

1

Вы можете использовать только ЗЕЬЕСТ в INSERT так:

INSERT INTO TABLE1 (col1, col2) SELECT col1, col2 from TABLE2 WHERE ... 

, но не в пункте ЦЕННОСТЕЙ - там должен быть константы:

INSERT INTO TABLE1 (col1, col2) VALUES (123, 123) 

Вы также могли бы создать временную таблицу и приобщать его в цель:

PROC SQL; CREATE TABLE VAL1 AS SELECT ....;QUIT; 
PROC APPEND DATA=VAL1 BASE=TABLE1; 
RUN; 

 Смежные вопросы

  • Нет связанных вопросов^_^