1) The form of table you have is a textbook example of "bad data practice". If I were you I would keep your data in "long" form:
data have;
input VPA $ date date9. value;
format date date9.;
cards;
ABC1 1apr2023 .
ABC1 2apr2023 2
ABC1 3apr2023 3
ABC1 4apr2023 .
ABC1 5apr2023 5
ABC2 1apr2023 .
ABC2 2apr2023 .
ABC2 3apr2023 3
ABC2 4apr2023 4
ABC2 5apr2023 .
ABC3 1apr2023 1
ABC3 2apr2023 .
ABC3 3apr2023 .
ABC3 4apr2023 4
ABC3 5apr2023 5
;
run;
with such "structure-less" data you could do the calculation like this:
data want1;
set have;
where value;
by VPA;
Number_of_days + 1;
if last.VPA then
do;
output;
Number_of_days = 0;
end;
keep VPA Number_of_days;
run;
proc print;
run;
2) But since you have data in this "bad" format:
options validvarname=ANY;
proc transpose data=have out=have_BAD(drop=_name_);
by VPA;
id date;
var value;
run;
proc print;
run;
you could do it like this using variables arrays:
data want2;
set have_BAD;
array d '1apr2023'n--'5apr2023'n;
do over d;
Number_of_days + d>.z;
end;
run;
proc print;
run;
Bart
[EDIT:]
P.S. Just to be clear variable arrays are very practical and useful tools. And it is "good programming practice" to learn how to work with them.