我有两张表A和B,如下所示。
表A
rowno flag1 flag2 flag3
1 1 0 0
2 0 1 1
3 0 0 0
4 0 1 1
5 0 0 1
6 0 0 0
7 0 0 0
8 0 1 0
9 0 0 0
10 1 0 0
表B
rowno flag1 flag2 flag3
表A和B具有相同的列名,但B最初是一个空表。
所以我想要完成的是使用宏逐行插入A到B的值,rowno迭代。每次我从A到B插入一行时,我想计算每个标志列的总和。
如果插入每一行后,总和(flag1)> 1或sum(flag2)> 1或sum(flag3)> 1,我需要删除表B中插入的行。然后迭代一直运行到表A中的观察结束。表B中的最终输出从表A得到5个观察结果。
我到目前为止的代码如下:
%macro iteration;
%do rowno=1 %to 10;
proc sql;
insert into table.B
select *
from table.A
where rowno = &rowno;
quit;
set table.B;
if
sum(flag1) > 1
or
sum(flag2) > 1
or
sum(flag3) > 1
then delete;
run;
%end;
%mend iteration;
%iteration
我收到了很多错误消息。
期待您的帮助和建议。感谢。
理想的输出数据看起来像这样
rowno flag1 flag2 flag3
1 1 0 0
2 0 1 1
3 0 0 0
6 0 0 0
7 0 0 0
答案 0 :(得分:0)
使用运行总和来计算每行的运行总和,而不是宏。如果需要删除一行,请记住将增量反转为运行总和。根据您的数据,我认为第9行也应该保留。
data TableA;
input rowno flag1 flag2 flag3;
cards;
1 1 0 0
2 0 1 1
3 0 0 0
4 0 1 1
5 0 0 1
6 0 0 0
7 0 0 0
8 0 1 0
9 0 0 0
10 1 0 0
;
run;
data TableB;
set TableA;
retain sum_:;
*Increment running sum for flag;
sum_flag1+flag1;
sum_flag2+flag2;
sum_flag3+flag3;
*Check flag amounts;
if sum_flag1>1 or sum_flag2>1 or sum_flag3>1 then do;
*if flag is tripped then delete increment to flag and remove record;
sum_flag1 +-flag1;
sum_flag2 +-flag2;
sum_flag3 +-flag3;
delete;
end;
run;