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

Hello,

I'm looking to create a cartesian product with 3 tables through datastep where 3 tables are following:

data min_scoperto_1;

input min_Scoperto $;

datalines;

0.01

0.02

0.03

;

run;

 

data scoperto_1;

input Scoperto $;

datalines;

0.1

0.2

0.3

0.5

1.0

2.0

;

run;

 

data limite_1;

input limite $;

datalines;

40

50

60

70

80

90

;

run;

For two tables - through datastep - the right code is the following

data c;

   set LIMITE_1;

   do i=1 to n;

      set SCOPERTO_1 point=i nobs=n;

      output;

   end;

run;

 

Which is the right sas code through datastep for the 3 tables?

Thanks in advance!

max

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

SQL will even outperform the data step loops once the datasets grow:

 72         
 73         data t1;
 74         do var1 = 1 to 300;
 75           output;
 76         end;
 77         run;
 
 NOTE: The data set WORK.T1 has 300 observations and 1 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           0.00 seconds
       cpu time            0.00 seconds
       
 
 78         
 79         data t2;
 80         do var2 = 1 to 300;
 81           output;
 82         end;
 83         run;
 
 NOTE: The data set WORK.T2 has 300 observations and 1 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           0.00 seconds
       cpu time            0.00 seconds
       
 
 84         
 85         data t3;
 86         do var3 = 1 to 300;
 87           output;
 88         end;
 89         run;
 
 NOTE: The data set WORK.T3 has 300 observations and 1 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           0.00 seconds
       cpu time            0.00 seconds
       
 
 90         
 91         proc sql;
 92         create table t4_1 as
 93           select *
 94           from t1, t2, t3
 95         ;
 NOTE: The execution of this query involves performing one or more Cartesian product joins that can not be optimized.
 NOTE: Table WORK.T4_1 created, with 27000000 rows and 3 columns.
 
 96         quit;
 NOTE:  Verwendet wurde: PROZEDUR SQL - (Gesamtverarbeitungszeit):
       real time           5.47 seconds
       cpu time            2.45 seconds
       
 
 97         
 98         data t4_2;
 99         set t1;
 100        do i = 1 to n1;
 101          set t2 point=i nobs=n1;
 102          do j = 1 to n2;
 103            set t3 point=j nobs=n2;
 104            output;
 105          end;
 106        end;
 107        run;
 
 NOTE: There were 300 observations read from the data set WORK.T1.
 NOTE: The data set WORK.T4_2 has 27000000 observations and 3 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           7.87 seconds
       cpu time            4.71 seconds

View solution in original post

4 REPLIES 4
Kurt_Bremser
Super User

Maxim 14: Use the Right Tool.

Which means that this is the right SAS code:

proc sql;
create table want as
  select *
  from min_scoperto_1, scoperto_1, limite_1
;
quit;

But you already have the data step method for 2 datasets; just nest a second DO loop for the third dataset inside the DO loop you already have for the second dataset.

Kurt_Bremser
Super User

SQL will even outperform the data step loops once the datasets grow:

 72         
 73         data t1;
 74         do var1 = 1 to 300;
 75           output;
 76         end;
 77         run;
 
 NOTE: The data set WORK.T1 has 300 observations and 1 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           0.00 seconds
       cpu time            0.00 seconds
       
 
 78         
 79         data t2;
 80         do var2 = 1 to 300;
 81           output;
 82         end;
 83         run;
 
 NOTE: The data set WORK.T2 has 300 observations and 1 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           0.00 seconds
       cpu time            0.00 seconds
       
 
 84         
 85         data t3;
 86         do var3 = 1 to 300;
 87           output;
 88         end;
 89         run;
 
 NOTE: The data set WORK.T3 has 300 observations and 1 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           0.00 seconds
       cpu time            0.00 seconds
       
 
 90         
 91         proc sql;
 92         create table t4_1 as
 93           select *
 94           from t1, t2, t3
 95         ;
 NOTE: The execution of this query involves performing one or more Cartesian product joins that can not be optimized.
 NOTE: Table WORK.T4_1 created, with 27000000 rows and 3 columns.
 
 96         quit;
 NOTE:  Verwendet wurde: PROZEDUR SQL - (Gesamtverarbeitungszeit):
       real time           5.47 seconds
       cpu time            2.45 seconds
       
 
 97         
 98         data t4_2;
 99         set t1;
 100        do i = 1 to n1;
 101          set t2 point=i nobs=n1;
 102          do j = 1 to n2;
 103            set t3 point=j nobs=n2;
 104            output;
 105          end;
 106        end;
 107        run;
 
 NOTE: There were 300 observations read from the data set WORK.T1.
 NOTE: The data set WORK.T4_2 has 27000000 observations and 3 variables.
 NOTE:  Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
       real time           7.87 seconds
       cpu time            4.71 seconds
max_ros
Obsidian | Level 7
thankyou so much!

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 933 views
  • 2 likes
  • 2 in conversation