如何接收和过滤来自报告的存储过程的数组数据是SAS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何接收和过滤来自报告的存储过程的数组数据是SAS相关的知识,希望对你有一定的参考价值。

我有一个名为_ID的参数,它从列表中接受多个值并将它们发送到我的存储过程,假设我已经在其中发送了四个值(1,2,3,4),我将在我的商店流程中收到它们,

_ID0 = 4
_ID1 = 1
_ID2 = 2
_ID3 = 3
_ID4 = 4
_ID_COUNT = 4

我正在接收并过滤它们如下。

%let ID = "&_ID";
%let Count  =  "&_ID_COUNT";

%macro IDs;
%global _ID0;

/* If more than one ID value was selected then cycle through the values */
    %if %eval(&_ID0 ge 2) %then %do;
          %do i=1 %to &_ID0;
            &&_ID&i
          %end;
    %end;

/* If only one ID value was selected  */
    %else &_ID
%mend;

****************************;

%macro filter;

%if &Count ne "0" %then %do;

 %stpbegin;
  proc sql noprint;
   create table users as 
   select *
   from work.users
   where id in(%IDs);
  run;
 %stpend;

%end;

%mend; %filter;

日志上面没有任何错误,一个是我的代码,但它没有过滤任何东西。如果用户表在id列中的值为1-10,则用户应仅使用1,2,3,4进行更新

user
 id
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10

过滤后我想要的

user
 id
  1
  2
  3
  4

我不知道什么是错的,我错过了任何更好的方法。

答案

你的代码应该有效。 %IDS宏可能更简洁,并且可能需要更多逻辑来处理当count小于2时如何创建宏变量的不一致性。因此,此宏将确保填充0和1变量(至少在在尝试遍历它们之前,宏正在运行。

%macro IDs;
%local i ;
%let _id0 = &_id_count ;
%if &_id0 = 1 %then %let _id1 = &_id ;
%if &_id0 = 0 %then -99999 ;
%do i=1 %to &_id0;
 &&_ID&i
%end;
%mend IDs;

根据您的示例数据,它应该像这样工作:

1071  %put (%ids);
(1  2  3  4)

如果他们没有选择任何值,您想要发出什么值?我已将此示例设置为生成-9999,但在这种情况下,您的其他宏应该已经跳过调用,因此它无关紧要。

以上是关于如何接收和过滤来自报告的存储过程的数组数据是SAS的主要内容,如果未能解决你的问题,请参考以下文章

如何根据2个数据源过滤SSRS报告

如何根据 2 个数据源过滤 s-s-rS 报告

sas first.variable啥意思

报告存储过程 - 如何避免重复?

如何在 Postman 中过滤来自 Docusign Rest API 的报告结果

sas如何对数据进行sha256加密