SAS EG SQL 如果 2 个计数相同,则创建一个名为 "SUCCESS" 的 table
SAS EG SQL create a table named "SUCCESS" if 2 counts are identical
我的过程中有两个计数,它们应该给出相同的结果。
一个是在一批查询之前,一个是在之后,我想确保连接操作没有添加或删除行。
现在我手动检查这些计数,但我想要一个指示一切正常的视觉指示器。
因此我有了编写一个程序的想法,如果这些计数相等,将创建一个名为 "SUCCESS" 的空 table,或者如果这些计数相等,则创建一个名为 "FAILURE" 的 table他们不是。
你能帮我设计实现这一目标的查询吗?
这是我的(显然没有用):
PROC SQL;
IF (SELECT count FROM WORK.count1) = (SELECT count FROM WORK.count2)
CREATE TABLE WORK.SUCCESS
ELSE
CREATE TABLE WORK.FAILURE
END
QUIT;
count1 和 count2 是两个 table,每个包含一个名为 count 的字段,一行包含要测试的值
创建 table 可能不是执行此操作的最佳方法,但您可以创建一个将消息打印到日志的宏。
%macro check_obs(d1, d2);
data _null_;
if 0 then set &d1 nobs=n;
call symput('count1',n);
stop;
run;
%put &count1;
data _null_;
if 0 then set &d2 nobs=n;
call symput('count2',n);
stop;
run;
%put &count2;
%if &count1 = &count2 %then %put Obs equal;
%else %put Obs not equal;
%mend;
/* Call the macro here */
%check_obs(work.count1, work.count2);
可能有一种更简单的方法可以做到这一点,但这个宏所做的只是将观察的数量存储到宏变量 count1
和 count2
中,然后检查它们是否相等。
我通常这样做的方式是在结果中显示一些有用的东西 window。
Title "Counts of Male and Female class members - check for equality";
proc sql;
select
(select count(1) from sashelp.class where sex='M') as male_count,
(select count(1) from sashelp.class where sex='F') as female_count
from sashelp.class where name='Alfred'
;
quit;
显然,您可以将其更改为从表 1 和表 2 进行查询。如果你愿意,你实际上可以保留 from sashelp.class where name='Alfred'
,除了提供单行结果集之外什么都不做(例如,它类似于 Oracle 的 from dual
),因为 SAS PROC SQL 需要一个 FROM .
然后用你的头衔告诉你应该从报告中收集到什么。
我不会使用 PROC SQL 做那样的事情。
data _null_;
merge count1(rename=(count=count1)) count2(rename=(count=count2));
if count1 ne count2 then call execute('data failure;run;');
else call execute('data success;run;');
run;
如果计数不同,让作业失败不是更好吗?不确定这在 Enterprise Guide 中是否正常工作,但在批处理中 运行 您可以有条件地 运行 ABORT ABEND 语句。
data _null_;
merge count1(rename=(count=count1)) count2(rename=(count=count2));
if count1 ne count2 then abort abend ;
run;
我的过程中有两个计数,它们应该给出相同的结果。
一个是在一批查询之前,一个是在之后,我想确保连接操作没有添加或删除行。
现在我手动检查这些计数,但我想要一个指示一切正常的视觉指示器。
因此我有了编写一个程序的想法,如果这些计数相等,将创建一个名为 "SUCCESS" 的空 table,或者如果这些计数相等,则创建一个名为 "FAILURE" 的 table他们不是。
你能帮我设计实现这一目标的查询吗?
这是我的(显然没有用):
PROC SQL;
IF (SELECT count FROM WORK.count1) = (SELECT count FROM WORK.count2)
CREATE TABLE WORK.SUCCESS
ELSE
CREATE TABLE WORK.FAILURE
END
QUIT;
count1 和 count2 是两个 table,每个包含一个名为 count 的字段,一行包含要测试的值
创建 table 可能不是执行此操作的最佳方法,但您可以创建一个将消息打印到日志的宏。
%macro check_obs(d1, d2);
data _null_;
if 0 then set &d1 nobs=n;
call symput('count1',n);
stop;
run;
%put &count1;
data _null_;
if 0 then set &d2 nobs=n;
call symput('count2',n);
stop;
run;
%put &count2;
%if &count1 = &count2 %then %put Obs equal;
%else %put Obs not equal;
%mend;
/* Call the macro here */
%check_obs(work.count1, work.count2);
可能有一种更简单的方法可以做到这一点,但这个宏所做的只是将观察的数量存储到宏变量 count1
和 count2
中,然后检查它们是否相等。
我通常这样做的方式是在结果中显示一些有用的东西 window。
Title "Counts of Male and Female class members - check for equality";
proc sql;
select
(select count(1) from sashelp.class where sex='M') as male_count,
(select count(1) from sashelp.class where sex='F') as female_count
from sashelp.class where name='Alfred'
;
quit;
显然,您可以将其更改为从表 1 和表 2 进行查询。如果你愿意,你实际上可以保留 from sashelp.class where name='Alfred'
,除了提供单行结果集之外什么都不做(例如,它类似于 Oracle 的 from dual
),因为 SAS PROC SQL 需要一个 FROM .
然后用你的头衔告诉你应该从报告中收集到什么。
我不会使用 PROC SQL 做那样的事情。
data _null_;
merge count1(rename=(count=count1)) count2(rename=(count=count2));
if count1 ne count2 then call execute('data failure;run;');
else call execute('data success;run;');
run;
如果计数不同,让作业失败不是更好吗?不确定这在 Enterprise Guide 中是否正常工作,但在批处理中 运行 您可以有条件地 运行 ABORT ABEND 语句。
data _null_;
merge count1(rename=(count=count1)) count2(rename=(count=count2));
if count1 ne count2 then abort abend ;
run;