BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
dr2014
Quartz | Level 8

Hi all,

I need some help in summarizing data using proc sql and/or any other way I could accomplish this. Below is the dataset 'have'

id

var1

var2

attempts

001

0

1

1

001

1

1

2

001

1

1

3

002

1

1

1

002

1

1

2

002

0

1

3

003

1

1

1

004

1

1

1

005

1

1

1

006

1

1

1

007

1

0

1

 I need to have counts of 'var2' based on values in 'var1 and var2' and also total count of 'attempts' by each id.

 So basically I need the dataset 'want' as I copy pasted below:

id

var2_novar1

var2_var1

novar2_var1

tot_attempts

001

1

2

0

3

002

1

2

0

3

003

0

1

0

1

004

0

1

0

1

005

0

1

0

1

006

0

1

0

1

007

0

0

1

1

 

var2_novar1:  counts where var2=1 and var1=0 by unique id

var2_var1:       counts where var2=1 and var1=1 by unique id

novar2_var1:  counts where var2=0 and var1=1 by unique id

tot_attempts: total count of attempts by unique id i.e. if there are 3 attempts for an id then tot_attempts=3

 

I used the below code and was able to get the variables one at a time i.evar2_novar1, var2_var1, novar2_var1 respectively and tot_attempts.

proc sql;

create table want as

select distinct id, count(var2) as var2_novar1, count(attempts)

from have

where var1=0 and var2=1

group by id;

quit;

 

Is there a way I can get all variables by writing 1 sas program? I don't want to use macros to get 3 different datasets and then merge.

 

I tried using the code below to create 1 variable but it didn't work. If it worked I was looking to use it in getting the rest of the variables in the same program. It refers to a syntax error in the 'case & when clause' and I am unable to figure it out.

proc sql;

create table want as

select distinct id, count(case var2 when (var1=0 and var2=1)) as var2_novar1,

               count(attempts)

from have

group by id;

quit;

 

Could anyone please help me with this? Thanks.

1 ACCEPTED SOLUTION

Accepted Solutions
novinosrin
Tourmaline | Level 20
data have;
input id	var1	var2	attempts;
cards;
1	0	1	1
1	1	1	2
1	1	1	3
2	1	1	1
2	1	1	2
2	0	1	3
3	1	1	1
4	1	1	1
5	1	1	1
6	1	1	1
7	1	0	1
;
proc sql;
create table want as
select *,sum(var2=1 and var1=0) as var2_novar1, sum(var2=1 and var1=1) as var2_var1, sum(var2=0 and var1=1) as novar2_var1
from have
group by id
having attempts=max(attempts);
quit;

View solution in original post

3 REPLIES 3
novinosrin
Tourmaline | Level 20
data have;
input id	var1	var2	attempts;
cards;
1	0	1	1
1	1	1	2
1	1	1	3
2	1	1	1
2	1	1	2
2	0	1	3
3	1	1	1
4	1	1	1
5	1	1	1
6	1	1	1
7	1	0	1
;
proc sql;
create table want as
select *,sum(var2=1 and var1=0) as var2_novar1, sum(var2=1 and var1=1) as var2_var1, sum(var2=0 and var1=1) as novar2_var1
from have
group by id
having attempts=max(attempts);
quit;
dr2014
Quartz | Level 8

@novinosrinThanks for your solution. It worked and was very helpful.

novinosrin
Tourmaline | Level 20

@dr2014 You are welcome. I'm glad 🙂

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

How to connect to databases in SAS Viya

Need to connect to databases in SAS Viya? SAS’ David Ghan shows you two methods – via SAS/ACCESS LIBNAME and SAS Data Connector SASLIBS – in this video.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 3 replies
  • 1548 views
  • 0 likes
  • 2 in conversation