Сообщение о неверном типе данных между оператором в SAS - PullRequest
0 голосов
/ 23 апреля 2020

Когда я запустил следующий код в SAS, мне сказали, что тип данных между «not in» отличается и не может продолжаться. Но я уже использовал 'input' для преобразования типа данных, поэтому я не знаю, что происходит не так.

ПРИМЕЧАНИЕ: DAT и EGDAT не из одной таблицы и имеют разные исходные типы данных.

 case when (input(DAT, yymmdd10.)) NOT IN 
                    (SELECT input(EGDAT, yymmdd10.) FROM SOURCE.EG001 WHERE VISIT IN 
                        ('SCREENING' , 'CYCLE1_DAY1' , ...))

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Либо столбцы данных не соответствуют вашим ожиданиям, либо имеется какая-то другая часть запроса, вызывающая сообщение.

Пример:

The SQL код похож на ваш и ошибок нет.

data claims(label="Simulated dates");
  length patid 8 DAT $8;

  call streaminit(20200423);

  do patid = 1 to 100;
  do _n_ = '01jan2020'd to '23apr2020'd;
    DAT = put (_n_, yymmddn8.);
    if rand ('uniform') < 0.05 then output;
  end;
  end;
run;

data visits(label="Simulated visit reasons");
  length patid 8 EGDAT $22;
  set claims(rename=dat=egdat);

  call streaminit(20200423);
  _n_ = rand('uniform');
  length visit $25;
  select;
    when (_n_ < 0.15) visit = 'SCREENING';
    when (_n_ < 0.30) visit = 'CANCELLED';
    when (_n_ < 0.45) visit = 'CYCLE1_DAY1';
    when (_n_ < 0.55) visit = 'ACHES';
    when (_n_ < 0.75) visit = 'PAINS';
    when (_n_ < 0.95) visit = 'CYCLE1_DAY2';
    otherwise visit = 'PLEASANT';
  end;
  output;
run;

proc sql; 
  create table want as
  select 
    claims.patid 
  , claims.DAT
  , case
      when input(DAT, yymmdd10.) not in 
      ( select input(egdat, yymmdd10.) 
        from visits
        where visits.patid = claims.patid
          and visit in ('SCREENING', 'CYCLE1_DAY1', 'CYCLE2_DAY2')
      ) 
      then 'NOT A SCREENING CLAIM'
      else 'SEEMS LIKE A SCREENING CLAIM'
    end as
      visit_classification
  from claims
  order by patid, dat
  ;
quit;
----- LOG -----
NOTE: Table WORK.WANT created, with 574 rows and 3 columns.

491  quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.16 seconds
      cpu time            0.01 seconds

0 голосов
/ 23 апреля 2020
Actually date stores in sas is numeric;
so if u want to switch them and align the format;
using put()--convert numeric into character; 
      input()- convert character in to numeric

    /*try blow code*/
         case when (put(DAT, yymmdd10.)) NOT IN 
                        (SELECT put(EGDAT, yymmdd10.) FROM SOURCE.EG001 WHERE VISIT IN 
                            ('SCREENING' , 'CYCLE1_DAY1' , ...))
...