<?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 Re: Invoking DO-LOOP-esque function within PROC SQL? in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102013#M28624</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Use proc freq.&lt;/P&gt;&lt;P&gt;proc freq data=ORIG_TABLE;&lt;/P&gt;&lt;P&gt;table GROUPVAR*listvalue/out=percentages outpct;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then Transpose your dataset 2 with a proc transpose and then merge the two to get what you need.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&#xD;
&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 17 Dec 2012 18:38:06 GMT</pubDate>
    <dc:creator>Reeza</dc:creator>
    <dc:date>2012-12-17T18:38:06Z</dc:date>
    <item>
      <title>Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102009#M28620</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello, I realize that PROC SQL doesn't inherently have a do-loop function but I'm wondering if there's a way I can simulate it using macros or something else?&amp;nbsp; I currently have a list of 53 three-letter combinations stored as a macro variable in my code.&amp;nbsp; So it's basically "ABC", "ABB", "CBA", etc.&amp;nbsp; I need to calculate % values for each one so that each one gets stored as its own variable.&amp;nbsp; I can get this to work fine if I write 53 lines of code (one per each list value) but I'm wondering if there's a way I can take the values that I've stored in a macro variable and have the code write those repeated 53 lines for me to save space?&amp;nbsp; I realize the final line would not have a comma at the end so I'd be fine with it writing 52 lines and then I'd include the 53rd manually.&amp;nbsp; I've attempted various different %DO's, %DO_OVER, %ARRAY functions but can't seem to get it to do what I want.&amp;nbsp; Any thoughts?&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;proc sql;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;create table TABLENAME as&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;select GROUPVAR, count(*) as Total_Count,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; (sum(case when LISTVALUE="ABC" then 1 else 0 end) / calculated Total_Count as pct_ABC),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*first of 52 repeated items*/&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; .&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; [Repeated 52 times for each 3-letter combo]&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; .&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; (sum(case when LISTVALUE="ZZZ" then 1 else 0 end) / calculated Total_Count as pct_ZZZ)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*final item from list*/&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;from ORIG_TABLE&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;group by GROUPVAR&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;quit;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Dec 2012 16:42:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102009#M28620</guid>
      <dc:creator>BoxingClever</dc:creator>
      <dc:date>2012-12-17T16:42:39Z</dc:date>
    </item>
    <item>
      <title>Re: Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102010#M28621</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;That seems extremely cumbersome. &lt;/P&gt;&lt;P&gt;Why not use proc freq or proc tabulate? Do you really need 53 new variables with percentages or one column per variable type?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Dec 2012 16:51:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102010#M28621</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2012-12-17T16:51:24Z</dc:date>
    </item>
    <item>
      <title>Re: Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102011#M28622</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Why not just use PROC SUMMARY or PROC FREQ?&amp;nbsp; If you really need the information as variables rather than rows then you can use PROC TRANSPOSE.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Dec 2012 17:43:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102011#M28622</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2012-12-17T17:43:02Z</dc:date>
    </item>
    <item>
      <title>Re: Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102012#M28623</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for your reply.&amp;nbsp; The reason why I *think* I need the dataset set up as wide w/53 new variables is because I have a separate dataset (Dataset #2) containing an "expected value" associated with each of the 53 groups.&amp;nbsp; For each of the GROUPVAR's, I need to calculate an overall Expected Value based on the % found within each of the 53 groups (simple case-adjustment).&amp;nbsp; See below for a snipped example.&amp;nbsp; Dataset #1 is the one I'm looking to create if possible.&amp;nbsp; If PROC TABULATE or PROC FREQ are better for this, I'm open to that -- I just happen to be more familiar with SQL for creating calculated tables like this.&amp;nbsp; Hope this makes sense -- thanks!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE border="0" cellpadding="0" cellspacing="0" style="width: 668px;"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD height="20" width="128"&gt;DATASET #1&lt;/TD&gt;&lt;TD class="xl65" width="64"&gt;%ABC&lt;/TD&gt;&lt;TD class="xl65" width="64"&gt;%ABB&lt;/TD&gt;&lt;TD class="xl65" width="64"&gt;%ACB&lt;/TD&gt;&lt;TD class="xl65" width="64"&gt;%BBB&lt;/TD&gt;&lt;TD class="xl65" width="64"&gt;etc.&lt;/TD&gt;&lt;TD class="xl65" width="64"&gt;%ZZZ&lt;/TD&gt;&lt;TD class="xl65" width="156"&gt;TOTAL EXPECTED VALUE&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt;GROUPVAR1&lt;/TD&gt;&lt;TD class="xl65"&gt;0.45&lt;/TD&gt;&lt;TD class="xl65"&gt;0&lt;/TD&gt;&lt;TD class="xl65"&gt;0.08&lt;/TD&gt;&lt;TD class="xl65"&gt;0.09&lt;/TD&gt;&lt;TD class="xl65"&gt;~&lt;/TD&gt;&lt;TD class="xl65"&gt;0.04&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt;GROUPVAR2&lt;/TD&gt;&lt;TD class="xl65"&gt;0.04&lt;/TD&gt;&lt;TD class="xl65"&gt;0.08&lt;/TD&gt;&lt;TD class="xl65"&gt;0.18&lt;/TD&gt;&lt;TD class="xl65"&gt;0.42&lt;/TD&gt;&lt;TD class="xl65"&gt;~&lt;/TD&gt;&lt;TD class="xl65"&gt;0.05&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt;GROUPVAR3&lt;/TD&gt;&lt;TD class="xl65"&gt;0&lt;/TD&gt;&lt;TD class="xl65"&gt;0&lt;/TD&gt;&lt;TD class="xl65"&gt;0.85&lt;/TD&gt;&lt;TD class="xl65"&gt;0.02&lt;/TD&gt;&lt;TD class="xl65"&gt;~&lt;/TD&gt;&lt;TD class="xl65"&gt;0.01&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;TD class="xl65"&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt;DATASET #2&lt;/TD&gt;&lt;TD class="xl65"&gt;ABC&lt;/TD&gt;&lt;TD class="xl65"&gt;ABB&lt;/TD&gt;&lt;TD class="xl65"&gt;ACB&lt;/TD&gt;&lt;TD class="xl65"&gt;BBB&lt;/TD&gt;&lt;TD class="xl65"&gt;etc.&lt;/TD&gt;&lt;TD class="xl65"&gt;ZZZ&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="20"&gt;EXPECTED HRS/DAY&lt;/TD&gt;&lt;TD class="xl65"&gt;12&lt;/TD&gt;&lt;TD class="xl65"&gt;3&lt;/TD&gt;&lt;TD class="xl65"&gt;24&lt;/TD&gt;&lt;TD class="xl65"&gt;4&lt;/TD&gt;&lt;TD class="xl65"&gt;~&lt;/TD&gt;&lt;TD class="xl65"&gt;22&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Dec 2012 18:12:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102012#M28623</guid>
      <dc:creator>BoxingClever</dc:creator>
      <dc:date>2012-12-17T18:12:42Z</dc:date>
    </item>
    <item>
      <title>Re: Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102013#M28624</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Use proc freq.&lt;/P&gt;&lt;P&gt;proc freq data=ORIG_TABLE;&lt;/P&gt;&lt;P&gt;table GROUPVAR*listvalue/out=percentages outpct;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Then Transpose your dataset 2 with a proc transpose and then merge the two to get what you need.&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&#xD;
&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Dec 2012 18:38:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102013#M28624</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2012-12-17T18:38:06Z</dc:date>
    </item>
    <item>
      <title>Re: Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102014#M28625</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I agree with my colleagues that you are doing work for which there are already existing procs but, from an academic perspective, something like the following (I think) could be used to "loop" through some data using proc sql:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*create a test dataset*/&lt;/P&gt;&lt;P&gt;data orig_table (keep=groupvar listvalue);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set sashelp.class (rename=(sex=groupvar));&lt;/P&gt;&lt;P&gt;&amp;nbsp; listvalue=put(age,2.);&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql noprint;&lt;/P&gt;&lt;P&gt;&amp;nbsp; select distinct "sum(case when listvalue='"||strip(listvalue)||&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "' then 1 else 0 end) /calculated Total_Count as pct_"||&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strip(listvalue)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; into :loop&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; separated by ","&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from orig_table&lt;/P&gt;&lt;P&gt; ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table TABLENAME as&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select groupvar, count(*) as Total_Count,&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;loop.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from orig_table&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; group by groupvar&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, 17 Dec 2012 19:14:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102014#M28625</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-17T19:14:09Z</dc:date>
    </item>
    <item>
      <title>Re: Invoking DO-LOOP-esque function within PROC SQL?</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102015#M28626</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;PROC FREQ worked perfectly.&amp;nbsp; Thanks all!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 17 Dec 2012 20:11:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Invoking-DO-LOOP-esque-function-within-PROC-SQL/m-p/102015#M28626</guid>
      <dc:creator>BoxingClever</dc:creator>
      <dc:date>2012-12-17T20:11:17Z</dc:date>
    </item>
  </channel>
</rss>

