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

I have the following data set and I want to get the desire data set

data one; 
input num name$ one$ two$ three$ four$ five $ ;
cards;
1 day1 NICE seeinn three four five
2 day1 one two three four3 five
3 day1 nice 1SEEInn2 GFL dlov dfdf
4 day23 one two thd ruhld hfdlhf
5 dfjdh Nice lseeinn fkdjf djfkd kjklj
6 dhhk one two dkfd alkdf aldkf
7 day1 ONE seeinn thde khf fllj
;
run;

below. 

I want to get these record in my output :

 

2 day1 one two three four3 five
4 day23 one two thd ruhld hfdlhf
6 dhhk one two dkfd alkdf aldkf

 

I tried following code, but wasn't successful getting the records I want. 

proc sql;
	create table want as 
	select *
	from one
		where name not in ( select name from one where ((upcase(name)='DAY1' AND UPCASE(ONE)='NICE') OR (upcase(name)='DAY1' AND UPCASE(TWO) LIKE '%SEEINN%')));
QUIT;

THANKS IN ADVANCE

1 ACCEPTED SOLUTION

Accepted Solutions
unison
Lapis Lazuli | Level 10

I suggest pulling out the criteria in a separate select statement to test:

proc sql;
select * from one 
where not(
	(upcase(name)='DAY1' AND UPCASE(ONE)='NICE') OR 
	(upcase(name)='DAY1' AND UPCASE(TWO) LIKE '%SEEINN%')
)
;quit;

Based on your current logic, it looks like there is a case when NAME is not DAY1 and two contains SEEINN.

-unison

View solution in original post

6 REPLIES 6
unison
Lapis Lazuli | Level 10

Can you simplify the logic to:

proc sql;
create table want as
select * from one where one='one' and two='two'
;quit;
-unison
buddha_d
Pyrite | Level 9

Thanks Unison for the reply. But that logic won't work for me. I created a dummy data set out of real data set. Yes, it would work for dummy data set that I provided. But that won't work. Sorry, but thanks anyway. 

buddha_d
Pyrite | Level 9

I need to exclude the records with name (day1) along with field one (NICE) or name (day1) with field two (containing anything with seeinn), but contain all other records. I hope this helps with my criteria 

unison
Lapis Lazuli | Level 10

I suggest pulling out the criteria in a separate select statement to test:

proc sql;
select * from one 
where not(
	(upcase(name)='DAY1' AND UPCASE(ONE)='NICE') OR 
	(upcase(name)='DAY1' AND UPCASE(TWO) LIKE '%SEEINN%')
)
;quit;

Based on your current logic, it looks like there is a case when NAME is not DAY1 and two contains SEEINN.

-unison
ed_sas_member
Meteorite | Level 14

Hi @buddha_d 

 

You can also use the set operator 'EXCEPT' to select rows:

proc sql;
	create table want as
	
	select *
	from one
	
	except
	
	select *
	from one
	where (upcase(name)='DAY1' and upcase(ONE)='NICE') or
	 	  (upcase(name)='DAY1' and upcase(TWO) like '%SEEINN%');
quit;

Best,

buddha_d
Pyrite | Level 9
Thanks this works too

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 564 views
  • 1 like
  • 3 in conversation