<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic cartesian product (cross join) in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8772#M464</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm looking to create a cartesian product with 3+ tables.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TableA:&lt;BR /&gt;------&lt;BR /&gt;Columns for TableA: colA&lt;BR /&gt;Values for colA: product A, product B, product C (three rows)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TableB:&lt;BR /&gt;------&lt;BR /&gt;Columns for TableB: colB&lt;BR /&gt;Values for colB: free, cheep, normal, expensive (four rows)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TableC:&lt;BR /&gt;------&lt;BR /&gt;Columns for TableC: colC&lt;BR /&gt;Values for colC: low, medium, high;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Query:&lt;BR /&gt;-----&lt;BR /&gt;select tableA.colA, tableB.colB, tableC.colC from tableA,tableB,tableC;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Result:&lt;BR /&gt;------&lt;/P&gt;&lt;P&gt;COLA COLB COLC&lt;BR /&gt;product A free low&lt;BR /&gt;product A free medium&lt;BR /&gt;product A free high&lt;BR /&gt;product B free low&lt;BR /&gt;product B free medium&lt;BR /&gt;product B free high&lt;BR /&gt;product C free low&lt;BR /&gt;product C free medium&lt;BR /&gt;product C free high&lt;BR /&gt;product A cheep low&lt;BR /&gt;product A cheep medium&lt;BR /&gt;product A cheep high&lt;BR /&gt;product B cheep low&lt;BR /&gt;product B cheep medium&lt;BR /&gt;product B cheep high&lt;BR /&gt;product C cheep low&lt;BR /&gt;product C cheep medium&lt;BR /&gt;product C cheep high&lt;BR /&gt;product A normal low&lt;BR /&gt;product A normal medium&lt;BR /&gt;product A normal high&lt;BR /&gt;product B normal low&lt;BR /&gt;product B normal medium&lt;BR /&gt;product B normal high&lt;BR /&gt;product C normal low&lt;BR /&gt;product C normal medium&lt;BR /&gt;product C normal high&lt;BR /&gt;product A expensive low&lt;BR /&gt;product A expensive medium&lt;BR /&gt;product A expensive high&lt;BR /&gt;product B expensive low&lt;BR /&gt;product B expensive medium&lt;BR /&gt;product B expensive high&lt;BR /&gt;product C expensive low&lt;BR /&gt;product C expensive medium&lt;BR /&gt;product C expensive high&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Instead, I want this result:&lt;BR /&gt;----------------------------&lt;/P&gt;&lt;P&gt;COLA COLB COLC&lt;BR /&gt;product A free low&lt;BR /&gt;product A free medium&lt;BR /&gt;product A free high&lt;BR /&gt;product A cheep low&lt;BR /&gt;product A cheep medium&lt;BR /&gt;product A cheep high&lt;BR /&gt;product A normal low&lt;BR /&gt;product A normal medium&lt;BR /&gt;product A normal high&lt;BR /&gt;product A expensive low&lt;BR /&gt;product A expensive medium&lt;BR /&gt;product A expensive high&lt;BR /&gt;product B free low&lt;BR /&gt;product B free medium&lt;BR /&gt;product B free high&lt;BR /&gt;product B cheep low&lt;BR /&gt;product B cheep medium&lt;BR /&gt;product B cheep high&lt;BR /&gt;product B normal low&lt;BR /&gt;product B normal medium&lt;BR /&gt;product B normal high&lt;BR /&gt;product B expensive low&lt;BR /&gt;product B expensive medium&lt;BR /&gt;product B expensive high&lt;BR /&gt;product C free low&lt;BR /&gt;product C free medium&lt;BR /&gt;product C free high&lt;BR /&gt;product C cheep low&lt;BR /&gt;product C cheep medium&lt;BR /&gt;product C cheep high&lt;BR /&gt;product C normal low&lt;BR /&gt;product C normal medium&lt;BR /&gt;product C normal high&lt;BR /&gt;product C expensive low&lt;BR /&gt;product C expensive medium&lt;BR /&gt;product C expensive high&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So the order is like this:&lt;/P&gt;&lt;P&gt;- first value colA&lt;BR /&gt;-- first value colB&lt;BR /&gt;--- first value colC&lt;BR /&gt;--- second value colC&lt;BR /&gt;--- third value colC&lt;BR /&gt;-- second value colB&lt;BR /&gt;--- first value colC&lt;BR /&gt;--- second value colC&lt;BR /&gt;--- third value colC&lt;BR /&gt;-- third value colB&lt;BR /&gt;--- first value colC&lt;BR /&gt;--- second value colC&lt;BR /&gt;--- third value colC&lt;BR /&gt;- second value colB&lt;BR /&gt;....&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any idea on how to do this?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Full code is attached. Uncomment "%*let COVd_colD = low, medium, high;" to test with 4 columns/variables.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 05 Dec 2011 18:17:07 GMT</pubDate>
    <dc:creator>CColpaert</dc:creator>
    <dc:date>2011-12-05T18:17:07Z</dc:date>
    <item>
      <title>cartesian product (cross join)</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8772#M464</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm looking to create a cartesian product with 3+ tables.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TableA:&lt;BR /&gt;------&lt;BR /&gt;Columns for TableA: colA&lt;BR /&gt;Values for colA: product A, product B, product C (three rows)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TableB:&lt;BR /&gt;------&lt;BR /&gt;Columns for TableB: colB&lt;BR /&gt;Values for colB: free, cheep, normal, expensive (four rows)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TableC:&lt;BR /&gt;------&lt;BR /&gt;Columns for TableC: colC&lt;BR /&gt;Values for colC: low, medium, high;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Query:&lt;BR /&gt;-----&lt;BR /&gt;select tableA.colA, tableB.colB, tableC.colC from tableA,tableB,tableC;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Result:&lt;BR /&gt;------&lt;/P&gt;&lt;P&gt;COLA COLB COLC&lt;BR /&gt;product A free low&lt;BR /&gt;product A free medium&lt;BR /&gt;product A free high&lt;BR /&gt;product B free low&lt;BR /&gt;product B free medium&lt;BR /&gt;product B free high&lt;BR /&gt;product C free low&lt;BR /&gt;product C free medium&lt;BR /&gt;product C free high&lt;BR /&gt;product A cheep low&lt;BR /&gt;product A cheep medium&lt;BR /&gt;product A cheep high&lt;BR /&gt;product B cheep low&lt;BR /&gt;product B cheep medium&lt;BR /&gt;product B cheep high&lt;BR /&gt;product C cheep low&lt;BR /&gt;product C cheep medium&lt;BR /&gt;product C cheep high&lt;BR /&gt;product A normal low&lt;BR /&gt;product A normal medium&lt;BR /&gt;product A normal high&lt;BR /&gt;product B normal low&lt;BR /&gt;product B normal medium&lt;BR /&gt;product B normal high&lt;BR /&gt;product C normal low&lt;BR /&gt;product C normal medium&lt;BR /&gt;product C normal high&lt;BR /&gt;product A expensive low&lt;BR /&gt;product A expensive medium&lt;BR /&gt;product A expensive high&lt;BR /&gt;product B expensive low&lt;BR /&gt;product B expensive medium&lt;BR /&gt;product B expensive high&lt;BR /&gt;product C expensive low&lt;BR /&gt;product C expensive medium&lt;BR /&gt;product C expensive high&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Instead, I want this result:&lt;BR /&gt;----------------------------&lt;/P&gt;&lt;P&gt;COLA COLB COLC&lt;BR /&gt;product A free low&lt;BR /&gt;product A free medium&lt;BR /&gt;product A free high&lt;BR /&gt;product A cheep low&lt;BR /&gt;product A cheep medium&lt;BR /&gt;product A cheep high&lt;BR /&gt;product A normal low&lt;BR /&gt;product A normal medium&lt;BR /&gt;product A normal high&lt;BR /&gt;product A expensive low&lt;BR /&gt;product A expensive medium&lt;BR /&gt;product A expensive high&lt;BR /&gt;product B free low&lt;BR /&gt;product B free medium&lt;BR /&gt;product B free high&lt;BR /&gt;product B cheep low&lt;BR /&gt;product B cheep medium&lt;BR /&gt;product B cheep high&lt;BR /&gt;product B normal low&lt;BR /&gt;product B normal medium&lt;BR /&gt;product B normal high&lt;BR /&gt;product B expensive low&lt;BR /&gt;product B expensive medium&lt;BR /&gt;product B expensive high&lt;BR /&gt;product C free low&lt;BR /&gt;product C free medium&lt;BR /&gt;product C free high&lt;BR /&gt;product C cheep low&lt;BR /&gt;product C cheep medium&lt;BR /&gt;product C cheep high&lt;BR /&gt;product C normal low&lt;BR /&gt;product C normal medium&lt;BR /&gt;product C normal high&lt;BR /&gt;product C expensive low&lt;BR /&gt;product C expensive medium&lt;BR /&gt;product C expensive high&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So the order is like this:&lt;/P&gt;&lt;P&gt;- first value colA&lt;BR /&gt;-- first value colB&lt;BR /&gt;--- first value colC&lt;BR /&gt;--- second value colC&lt;BR /&gt;--- third value colC&lt;BR /&gt;-- second value colB&lt;BR /&gt;--- first value colC&lt;BR /&gt;--- second value colC&lt;BR /&gt;--- third value colC&lt;BR /&gt;-- third value colB&lt;BR /&gt;--- first value colC&lt;BR /&gt;--- second value colC&lt;BR /&gt;--- third value colC&lt;BR /&gt;- second value colB&lt;BR /&gt;....&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Any idea on how to do this?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Full code is attached. Uncomment "%*let COVd_colD = low, medium, high;" to test with 4 columns/variables.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 05 Dec 2011 18:17:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8772#M464</guid>
      <dc:creator>CColpaert</dc:creator>
      <dc:date>2011-12-05T18:17:07Z</dc:date>
    </item>
    <item>
      <title>cartesian product (cross join)</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8773#M465</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You could probably convert this to be all sql, but I have some other things I have to do this afternoon and this was the quickest working solution I could come up with.&amp;nbsp; It uses a mixture of proc format, a data step and, finally, proc sql:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let COVa_colA = product A, product B, product C;&lt;/P&gt;&lt;P&gt;%let COVb_colB = free, cheep, normal, expensive;&lt;/P&gt;&lt;P&gt;%let COVc_colC = low, medium, high;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc format;&lt;/P&gt;&lt;P&gt;&amp;nbsp; invalue $orderb&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'free'=1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'cheap'=2&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'normal'=3&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'expensive'=4;&lt;/P&gt;&lt;P&gt;&amp;nbsp; invalue $orderc&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'low'=1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'medium'=2&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'high'=3;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data temp1 (keep=cola)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp2 (keep=cola)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp3 (keep=cola);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set sashelp.vmacro (where=(&lt;/P&gt;&lt;P&gt;&amp;nbsp; scope eq 'GLOBAL' and prxmatch('/^COV\w_.+$/i',name )));&lt;/P&gt;&lt;P&gt;&amp;nbsp; i=1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; do while (scan(value,i) ne "");&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cola=scan(value,i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if name =: "COVA" then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cola=catx(" ",cola,scan(value,i+1));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output temp1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i+2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if name =: "COVB" then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output temp2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if name =: "COVC" then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output temp3;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql noprint;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table want as&lt;/P&gt;&lt;P&gt;&amp;nbsp; select *&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from temp1,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp2 (rename=(cola=colb)),&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp3 (rename=(cola=colc))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by cola,input(colb,$orderb.),&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; input(colc,$orderc.);&lt;/P&gt;&lt;P&gt;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 05 Dec 2011 20:38:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8773#M465</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2011-12-05T20:38:00Z</dc:date>
    </item>
    <item>
      <title>cartesian product (cross join)</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8774#M466</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;How about:&lt;/P&gt;&lt;P&gt;It is a big advantage of SAS . keeping the original order of obs.&lt;/P&gt;&lt;P&gt;But it is not as efficient as SQL.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE&gt;data TableA ;
input colA $10.;;
cards;
product A
product B
product C
;
run;
data TableB ;
input colB $10.;;
cards;
free
cheep
normal
expensive
;
run;
data TableC ;
input colC $10.;;
cards;
low
medium
high
;
run;
data want;
 set tableA;
 do i=1 to _nobs;
&amp;nbsp; set tableB nobs=_nobs point=i;
&amp;nbsp;&amp;nbsp; do j=1 to __nobs;
&amp;nbsp;&amp;nbsp;&amp;nbsp; set tableC nobs=__nobs point=j;
&amp;nbsp;&amp;nbsp;&amp;nbsp; output;
&amp;nbsp;&amp;nbsp; end;
 end;
run;


&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Ksharp&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 06 Dec 2011 03:53:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8774#M466</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2011-12-06T03:53:43Z</dc:date>
    </item>
    <item>
      <title>cartesian product (cross join)</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8775#M467</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Without having dug into your attachment - I think this can be solved if you can have some rank/sort order variables in your source tables:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;select tableA.colA, tableB.colB, tableC.colC&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from tableA,tableB,tableC&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by tablA.OrderColA, tableB.OrderColB, tableC.OrderColC&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/Linus&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 06 Dec 2011 09:10:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8775#M467</guid>
      <dc:creator>LinusH</dc:creator>
      <dc:date>2011-12-06T09:10:41Z</dc:date>
    </item>
    <item>
      <title>Re: cartesian product (cross join)</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8776#M468</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for your help guys. Great example of how you can achieve a result in various ways &lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The following code also works as expected:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let COVa_product = product A, product B, product C;&lt;/P&gt;&lt;P&gt;%let COVb_price = free, cheep, normal, expensive;&lt;/P&gt;&lt;P&gt;%let COVc_quality = low, medium, high;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%macro create_prod;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select name, count(*) into :covs separated by ',', :n_covs&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from sashelp.vmacro&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where scope = 'GLOBAL' and prxmatch('/^COV\w_.+$/i',name )&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by name ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put count: &amp;amp;n_covs;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put covs: &amp;amp;covs;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data all (drop=_:);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %do i = 1 %to &amp;amp;n_covs;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let cov = %scan(%quote(&amp;amp;covs),&amp;amp;i,',');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let var = %scan(&amp;amp;cov,2,_);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length _%scan(&amp;amp;cov,2,_) $ 200 %scan(&amp;amp;cov,2,_) $ 30;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _%scan(&amp;amp;cov,2,_) = symget("&amp;amp;cov");&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do _i_%scan(&amp;amp;cov,2,_) = 1 to countw(_%scan(&amp;amp;cov,2,_),',');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %scan(&amp;amp;cov,2,_) = strip(scan(_%scan(&amp;amp;cov,2,_),_i_%scan(&amp;amp;cov,2,_),','));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *putlog "%scan(&amp;amp;cov,2,_):" %scan(&amp;amp;cov,2,_);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %do i = 1 %to &amp;amp;n_covs;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%mend;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%create_prod;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 06 Dec 2011 09:14:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/cartesian-product-cross-join/m-p/8776#M468</guid>
      <dc:creator>CColpaert</dc:creator>
      <dc:date>2011-12-06T09:14:09Z</dc:date>
    </item>
  </channel>
</rss>

