Как выбрать диапазон столбцов в выписке case в pro c SQL? - PullRequest
0 голосов
/ 16 марта 2020

У меня около 80 имен столбцов от diag1 до diag80. Мне интересно, как я могу выбрать только 30 столбцов и применить оценку случая в Pro c SqL. Следующий код выдает ошибку, потому что он не понимает диапазон.

proc sql;
  create table data_WANT as
  select *,
    case 
      when **diag1:diag30** in ('F00','G30','F01','F02','F03','F051') then 1
      else 0 
    end as p_nervoussystem
  from data_HAVE;
quit;

Спасибо, любая помощь приветствуется!

Ответы [ 3 ]

1 голос
/ 16 марта 2020

У вас есть две проблемы с этим попыткой синтаксиса. Во-первых, списки переменных не поддерживаются PRO C SQL (поскольку они не поддерживаются синтаксисом SQL). Во-вторых, не существует простого синтаксиса для поиска по N переменным списка M строк.

Вам понадобится al oop некоторого вида. В коде SAS это будет намного проще, чем в SQL.

Например, вы можете создать массив для ссылки на ваши 30 переменных, а не на l oop поверх переменных, проверяя, имеет ли каждая из них значение в списке ценностей. Вы можете прекратить проверку, как только один найден.

data want;
  set have;
  array vars diag1-diag30;
  p_nervoussystem=0;
  do index=1 to dim(vars) while (not p_nervoussystem);
    p_nervoussystem = vars[index] in ('F00','G30','F01','F02','F03','F051');
  end;
run;
0 голосов
/ 16 марта 2020

Обратная схема @Tom для поиска диагноза нервной системы c код:

  • через FINDW через конкатенацию наблюдаемых диагнозов
  • через WHICHC по массиву наблюдаемых диагнозов
data have;
  infile datalines missover;
  length id 8;
  array dx(30) $5;
  input id (dx1-dx50) (50*:$5.);
  datalines;
1 A00 B00 A12
2 F00 Z12 T45
3 A01 A02 B12 F00
4 Q12
5 Q13
6 T14
7 F44 F45 F46
8 . . . . . . . . . . . . . . G30
;


data want;

  length p_nervoussystem p_ns 4;

  set have;

  array dx dx:;
  array ns(6) $5 _temporary_ ('F00','G30','F01','F02','F03','F051');

  dx_catx = catx(' ', of dx(*));*  drop dx_catx;           * way 1;

  do _n_ = 1 to dim(ns) until(p_nervoussystem);
    p_nervoussystem = 0 < indexw(dx_catx, trim(ns(_n_)));  * way 1;
    p_ns = 0 < whichc(ns(_n_), of dx(*));                  * way 2;
  end;
run;```
0 голосов
/ 16 марта 2020

попробуйте sys.tables и sys.columns и отфильтруйте ваши столбцы.

SELECT * FROM sys.tables ВХОД В СИСТЕМУ sys.columns ON columns.object_id = tables.object_id

...