<?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: The SAS variant to SQL for each X do Y. in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264566#M51920</link>
    <description>&lt;P&gt;How could I forget about "group by". That basically means for each, but I find it very unnatural that you do that in one of your last steps.&lt;/P&gt;</description>
    <pubDate>Mon, 18 Apr 2016 13:58:08 GMT</pubDate>
    <dc:creator>Yves_Boonen</dc:creator>
    <dc:date>2016-04-18T13:58:08Z</dc:date>
    <item>
      <title>The SAS variant to SQL for each X do Y.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264554#M51915</link>
      <description>&lt;P&gt;I have been wondering about this for a while, and I haven't been able to find any answers online. The following data is fictional, but let's say you have this table:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;zone&lt;/TD&gt;&lt;TD&gt;reports&lt;/TD&gt;&lt;TD&gt;oldest_date1&lt;/TD&gt;&lt;TD&gt;accidents&lt;/TD&gt;&lt;TD&gt;oldest_date2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE1&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;31/01/2016&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;31/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;29/01/2016&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;29/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE1&lt;/TD&gt;&lt;TD&gt;7&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE1&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;3/02/2016&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3/02/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;31/01/2016&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;31/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE2&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;29/01/2016&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;29/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE2&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;TD&gt;5&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE2&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;3/02/2016&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3/02/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE3&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;31/01/2016&lt;/TD&gt;&lt;TD&gt;8&lt;/TD&gt;&lt;TD&gt;31/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE3&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;29/01/2016&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;29/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE3&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE3&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;3/02/2016&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;3/02/2016&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Let's say you wanted to create a query that counts all the reports and accidents for each zone and remembers the lowest date for each report and accident for each zone. The result table should look like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;zone&lt;/TD&gt;&lt;TD&gt;reports&lt;/TD&gt;&lt;TD&gt;oldest_date1&lt;/TD&gt;&lt;TD&gt;accidents&lt;/TD&gt;&lt;TD&gt;oldest_date2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE1&lt;/TD&gt;&lt;TD&gt;17&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE2&lt;/TD&gt;&lt;TD&gt;23&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;TD&gt;12&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ZONE3&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;TD&gt;9&lt;/TD&gt;&lt;TD&gt;27/01/2016&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In SQL you could easily approach this with something like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;for each zone (sum(reports), min(oldest_date1), sum(accidents), min(oldest_date2))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And there you have it, you will receive a table like the one above.&amp;nbsp;SAS seems &lt;SPAN&gt;devious when you want to do something like that and (for as far as&amp;nbsp;I know) requires you to write a complex datastep. Is this true? Or could someone enlighten me?&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 18 Apr 2016 13:41:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264554#M51915</guid>
      <dc:creator>Yves_Boonen</dc:creator>
      <dc:date>2016-04-18T13:41:02Z</dc:date>
    </item>
    <item>
      <title>Re: The SAS variant to SQL for each X do Y.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264562#M51917</link>
      <description>&lt;P&gt;Hi Yves,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You need&amp;nbsp;the GROUP BY clause:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
select zone, sum(reports) as reports, min(oldest_date1) as oldest_date1 format=ddmmyy10.,
             sum(accidents) as accidents, min(oldest_date2) as oldest_date2 format=ddmmyy10.
from have
group by zone;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 18 Apr 2016 13:46:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264562#M51917</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2016-04-18T13:46:04Z</dc:date>
    </item>
    <item>
      <title>Re: The SAS variant to SQL for each X do Y.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264563#M51918</link>
      <description>&lt;P&gt;Not sure that the SQL variant is much shorted code wise than a datastep:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data want;  /* Drop or rename as you need */
  set have;
  by zone;
  retain sum_reports min_date1 sum_accidents min_date2;
  if first.zone then do;
    sum_reports=reports;
    min_date1=oldest_date1;
    sum_accidents=accidents;
    min_date2=oldest_date2;
  end;
  else;
    sum_reports=sum(sum_reports,reports);
    min_date1=ifn(oldest_date1 &amp;lt; min_date1,oldest_date1,min_date1);
    sum_accidents=sum(sum_accidents,accidents);
    min_date2=ifn(oldest_date2 &amp;lt; min_date2,oldest_date2,min_date2);
  end;
  if last.zone then output;
run;&lt;/PRE&gt;</description>
      <pubDate>Mon, 18 Apr 2016 13:49:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264563#M51918</guid>
      <dc:creator>RW9</dc:creator>
      <dc:date>2016-04-18T13:49:01Z</dc:date>
    </item>
    <item>
      <title>Re: The SAS variant to SQL for each X do Y.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264564#M51919</link>
      <description>&lt;P&gt;A complex DATA step is not needed.&amp;nbsp; PROC SUMMARY can handle this.&amp;nbsp; Since it appears that your data set is sorted by ZONE, I will use that in the solution.&amp;nbsp; Workarounds are possible if that's not the case.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc summary data=have;&lt;/P&gt;
&lt;P&gt;by zone;&lt;/P&gt;
&lt;P&gt;var reports oldest_date1 accidents oldest_date2;&lt;/P&gt;
&lt;P&gt;output out=want (drop=_type_ _freq_) sum(reports)=reports sum(accidents)=accidents min(oldest_date1)=oldest_date1&lt;/P&gt;
&lt;P&gt;min(oldest_date2)=oldest_date2;&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;</description>
      <pubDate>Mon, 18 Apr 2016 13:49:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264564#M51919</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2016-04-18T13:49:04Z</dc:date>
    </item>
    <item>
      <title>Re: The SAS variant to SQL for each X do Y.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264566#M51920</link>
      <description>&lt;P&gt;How could I forget about "group by". That basically means for each, but I find it very unnatural that you do that in one of your last steps.&lt;/P&gt;</description>
      <pubDate>Mon, 18 Apr 2016 13:58:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264566#M51920</guid>
      <dc:creator>Yves_Boonen</dc:creator>
      <dc:date>2016-04-18T13:58:08Z</dc:date>
    </item>
    <item>
      <title>Re: The SAS variant to SQL for each X do Y.</title>
      <link>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264569#M51921</link>
      <description>&lt;P&gt;Proc summary/means is the equivalent.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Think of the case where you want multiple levels, ie group by and total, or subtotals, proc means can incorporate that. Proc SQL cannot, without multiple queries.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 18 Apr 2016 14:16:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/The-SAS-variant-to-SQL-for-each-X-do-Y/m-p/264569#M51921</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2016-04-18T14:16:22Z</dc:date>
    </item>
  </channel>
</rss>

