<?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: Aggregate in proc sql with calculated key in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Aggregate-in-proc-sql-with-calculated-key/m-p/754928#M238169</link>
    <description>&lt;P&gt;The "Rank" and "over partition" are non-standard SQL Extension. Practically every dialect of SQL has some.&lt;/P&gt;
&lt;P&gt;SAS Proc SQL is basically ANSI SQL with a number of functions that are non-standard.&lt;/P&gt;
&lt;P&gt;Sequential numbering would be done in a data step generally.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since you don't actually show an example with your "Rank" I am not sure exactly how you are actually intending to calculate that. I have to say any variable called Year calculated as you propose is extremely confusing. Especially since the three lines of example data you show includes monthly dates crossing two years.&lt;/P&gt;</description>
    <pubDate>Mon, 19 Jul 2021 08:02:28 GMT</pubDate>
    <dc:creator>ballardw</dc:creator>
    <dc:date>2021-07-19T08:02:28Z</dc:date>
    <item>
      <title>Aggregate in proc sql with calculated key</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Aggregate-in-proc-sql-with-calculated-key/m-p/754913#M238163</link>
      <description>&lt;P&gt;&lt;SPAN&gt;I would like some suggestion for my SAS SQL Code. Suppose I have long format table with 4 Columns. There are multiple account, multiple date as follow:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="lang-sql s-code-block"&gt;&lt;CODE class="hljs language-sql"&gt;ACCOUNT &lt;SPAN class="hljs-type"&gt;DATE&lt;/SPAN&gt;      STAGE AMOUNT
A001    &lt;SPAN class="hljs-number"&gt;01&lt;/SPAN&gt;DEC2020   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;01&lt;/SPAN&gt;JAN2021   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;01&lt;/SPAN&gt;FEB2021   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
...     ...        ...  ...&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;What I am trying to do is I created sequential order column, named&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;RANK&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;by starting from 1 by&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;ACCOUNT&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;DATE&lt;/CODE&gt;. Then, I will create&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;YEAR&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;column by&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;CEIL(RANK / 12)&lt;/CODE&gt;. After that I will create&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;OS&lt;/CODE&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Column by condition&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;WHEN CASE&lt;/CODE&gt;.&lt;/P&gt;&lt;P&gt;The final table that I needed to aggregate columns&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;GROUP BY ACCOUNT, YEAR&lt;/CODE&gt;. However, the result is not followed as expecting. I got multiple duplicated rows after running the code.&lt;/P&gt;&lt;P&gt;Below is my code from SAS SQL. SAS is not allow to use&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;CODE&gt;RANK() OVER(PARTITION)&lt;/CODE&gt;.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="lang-sql s-code-block"&gt;&lt;CODE class="hljs language-sql"&gt;proc &lt;SPAN class="hljs-keyword"&gt;sql&lt;/SPAN&gt;;
&lt;SPAN class="hljs-keyword"&gt;CREATE&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;TABLE&lt;/SPAN&gt; workingData (&lt;SPAN class="hljs-keyword"&gt;DROP&lt;/SPAN&gt; &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; RANK OS) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt;
    ACCOUNT,
    STAGE,
    (&lt;SPAN class="hljs-keyword"&gt;SELECT&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;COUNT&lt;/SPAN&gt;(&lt;SPAN class="hljs-keyword"&gt;DISTINCT&lt;/SPAN&gt; b.DATE)
        &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; loanData b
        &lt;SPAN class="hljs-keyword"&gt;WHERE&lt;/SPAN&gt; b.DATE &lt;SPAN class="hljs-operator"&gt;&amp;lt;=&lt;/SPAN&gt; a.DATE
            &lt;SPAN class="hljs-keyword"&gt;AND&lt;/SPAN&gt; a.ACCOUNT eq b.ACCOUNT) &lt;SPAN class="hljs-keyword"&gt;as&lt;/SPAN&gt; RANK,
    &lt;SPAN class="hljs-built_in"&gt;CEIL&lt;/SPAN&gt;(CALCULATED RANK &lt;SPAN class="hljs-operator"&gt;/&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;12&lt;/SPAN&gt;) &lt;SPAN class="hljs-keyword"&gt;as&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;YEAR&lt;/SPAN&gt;,
    &lt;SPAN class="hljs-keyword"&gt;CASE&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;WHEN&lt;/SPAN&gt; CALCULATED RANK &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;THEN&lt;/SPAN&gt; a.AMOUNT
        &lt;SPAN class="hljs-keyword"&gt;ELSE&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;END&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; OS,
    CALCULATED &lt;SPAN class="hljs-keyword"&gt;YEAR&lt;/SPAN&gt;,
    &lt;SPAN class="hljs-built_in"&gt;MAX&lt;/SPAN&gt;(OS) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; OUTSTANDING,
    MEAN(AMOUNT) &lt;SPAN class="hljs-keyword"&gt;AS&lt;/SPAN&gt; EAD 
    &lt;SPAN class="hljs-keyword"&gt;FROM&lt;/SPAN&gt; loanData a
    &lt;SPAN class="hljs-keyword"&gt;GROUP&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; ACCOUNT, CALCULATED &lt;SPAN class="hljs-keyword"&gt;YEAR&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;HAVING&lt;/SPAN&gt; STAGE &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;
        &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; (STAGE &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;AND&lt;/SPAN&gt; CALCULATED RANK &lt;SPAN class="hljs-operator"&gt;&amp;lt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;12&lt;/SPAN&gt;)
            &lt;SPAN class="hljs-keyword"&gt;OR&lt;/SPAN&gt; (STAGE &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;AND&lt;/SPAN&gt; CALCULATED RANK &lt;SPAN class="hljs-operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;)
    &lt;SPAN class="hljs-keyword"&gt;ORDER&lt;/SPAN&gt; &lt;SPAN class="hljs-keyword"&gt;BY&lt;/SPAN&gt; ACCOUNT, &lt;SPAN class="hljs-keyword"&gt;YEAR&lt;/SPAN&gt;
    ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;SPAN&gt;The result is shown below:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE class="lang-sql s-code-block"&gt;&lt;CODE class="hljs language-sql"&gt;ACCOUNT STAGE &lt;SPAN class="hljs-keyword"&gt;YEAR&lt;/SPAN&gt; OUTSTANDING EAD
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A002    &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;50000&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;40669.25&lt;/SPAN&gt;
A002    &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;50000&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;40669.25&lt;/SPAN&gt;
A002    &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;50000&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;40669.25&lt;/SPAN&gt;
...     ... ... ...     ...&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;But what I expected is:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE class="lang-sql s-code-block"&gt;&lt;CODE class="hljs language-sql"&gt;ACCOUNT STAGE &lt;SPAN class="hljs-keyword"&gt;YEAR&lt;/SPAN&gt; OUTSTANDING EAD
A001    &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;  &lt;SPAN class="hljs-number"&gt;100000&lt;/SPAN&gt;
A002    &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;50000&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;40669.25&lt;/SPAN&gt;
A002    &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt;32024&lt;/SPAN&gt;
A002    &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt;23888&lt;/SPAN&gt;
A003    &lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;40000&lt;/SPAN&gt;   &lt;SPAN class="hljs-number"&gt;40000&lt;/SPAN&gt;
...     ... ... ...     ...&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;Any suggestion on the process that I have just only one chuck of SQL to do it. Thanks!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 19 Jul 2021 06:28:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Aggregate-in-proc-sql-with-calculated-key/m-p/754913#M238163</guid>
      <dc:creator>LengYi</dc:creator>
      <dc:date>2021-07-19T06:28:42Z</dc:date>
    </item>
    <item>
      <title>Re: Aggregate in proc sql with calculated key</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Aggregate-in-proc-sql-with-calculated-key/m-p/754928#M238169</link>
      <description>&lt;P&gt;The "Rank" and "over partition" are non-standard SQL Extension. Practically every dialect of SQL has some.&lt;/P&gt;
&lt;P&gt;SAS Proc SQL is basically ANSI SQL with a number of functions that are non-standard.&lt;/P&gt;
&lt;P&gt;Sequential numbering would be done in a data step generally.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since you don't actually show an example with your "Rank" I am not sure exactly how you are actually intending to calculate that. I have to say any variable called Year calculated as you propose is extremely confusing. Especially since the three lines of example data you show includes monthly dates crossing two years.&lt;/P&gt;</description>
      <pubDate>Mon, 19 Jul 2021 08:02:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Aggregate-in-proc-sql-with-calculated-key/m-p/754928#M238169</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2021-07-19T08:02:28Z</dc:date>
    </item>
  </channel>
</rss>

