SAS pro c sql - это правильное использование? - PullRequest
0 голосов
/ 14 февраля 2020

Это работает, но требуется проверка работоспособности, если я сделал это правильно с помощью pro c sql connect to ie мне нужно иметь отдельный "select * from connection to"?

proc sql;
connect to database (database=test user="&srvuser" password="&srvpass") ;
create table bob as 
select t1._ as bob1 
      ,t2._ as bob2 
      ,t3._ as bob3
      ,t1._-t2._ as bob4
from (select * from connection to database
(Select count(*)
        from DAVE.IMAGE_MSG_LOG 
        where RR_MSG_CODE  = 'D' and RR_MSG_SEQ_NO = 1)) t1
,(select * from connection to database
(Select count(*)
        from DAVE.IMAGE_MSG_LOG 
        where RR_MSG_CODE  = 'R')) t2
,(select * from connection to database
(Select count(*)
        from DAVE.IMAGE_MSG_LOG 
        where RR_MSG_CODE  = 'R' and RR_MSG_TIME_STAMP IS NULL)) t3;
disconnect from database;
quit;
run;

Спасибо

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Поскольку вы извлекаете данные из одной и той же базы данных, просто сделайте объединение в базу данных. Пока вы работаете с ним, присвойте имена переменным при их создании.

create table bob as 
select bob1 
     , bob2 
     , bob3
     , bob1-bob2 as bob4
from connection to database 
(select t1.bob1
      , t2.bob2
      , t3.bob3 
 from
  (select count(*) as bob1
   from DAVE.IMAGE_MSG_LOG 
   where RR_MSG_CODE  = 'D' and RR_MSG_SEQ_NO = 1
  ) t1
, (select count(*) as bob2
   from DAVE.IMAGE_MSG_LOG 
   where RR_MSG_CODE  = 'R'
   ) t2
, (select count(*) as bob3
   from DAVE.IMAGE_MSG_LOG 
   where RR_MSG_CODE  = 'R' and RR_MSG_TIME_STAMP IS NULL
  ) t3
);

Поскольку вы генерируете эти подсчеты, запрашивая одну и ту же таблицу (набор данных), вы можете выполнить для нее один запрос, используя вместо этого CASE ГДЕ.

(select sum(case when (RR_MSG_CODE  = 'D' and RR_MSG_SEQ_NO = 1) then 1 
            else 0 end) as bob1
      , sum(case when (RR_MSG_CODE  = 'R') then 1 
            else 0 end) as bob2
      , sum(case when (RR_MSG_CODE  = 'R' and RR_MSG_TIME_STAMP IS NULL) then 1 
            else 0 end) as bob3
 from DAVE.IMAGE_MSG_LOG 
)

Хотя вы можете добавить общие условия в предложение where, чтобы оно обрабатывало меньше записей.

where RR_MSG_CODE in ('R','D')
0 голосов
/ 14 февраля 2020

Запрос мог бы работать таким образом, но более чистый подход мог бы заключаться в том, чтобы выполнить все операции на стороне сервера в одном запросе за один connection to

create table want as
select bob1, bob2, bob3, bob1-bob2 as bob4 from connection to database 
(
 select 
  (select count(*) from DAVE.IMAGE_MSG_LOG 
   where RR_MSG_CODE  = 'D' and RR_MSG_SEQ_NO = 1) as bob1,
  (select count(*) from DAVE.IMAGE_MSG_LOG 
   where RR_MSG_CODE  = 'R') as bob2,
  (select count(*) from DAVE.IMAGE_MSG_LOG 
   where RR_MSG_CODE  = 'R' and RR_MSG_TIME_STAMP IS NULL) as bob3
)

Несколько иной подход мог бы возвращать одну строку на счетчик. Набор результатов может быть транспонирован в SAS. Там можно было бы исключить предложение where, но удаленной системе пришлось бы проходить каждую запись в IMAGE_MSG_LOG и терять способность использовать любые индексы, которые может использовать where.

create table want as
select * from connection to database 
(
  select 
    case 
      when RR_MSG_CODE  = 'D' and RR_MSG_SEQ_NO = 1 then 'D1'
      when RR_MSG_CODE  = 'R' and RR_MSG_TIME_STAMP IS NULL then 'RNULL'
      when RR_MSG_CODE  = 'R' then 'RNOTNULL'
      else 'NOCAT'
    end
    as category,
    count(*) as category_count
  from DAVE.IMAGE_MSG_LOG
  where 
      (RR_MSG_CODE  = 'D' and RR_MSG_SEQ_NO = 1)
   or (RR_MSG_CODE  = 'R')
  group by category
)

После транспонирования

  • bob1 равно D1
  • bob2 равно RNULL + RNOTNULL
  • bob3 равно RNULL
  • bob4 is bob1 - bob2
...