Reputation: 47
In a SQL Server 2012 database I have the following table with a running total (RunAmount)
<table><TBODY>
<TR>
<TH>BUDataId</TH>
<TH>BU</TH>
<TH>AccountNum</TH>
<TH>Category</TH>
<TH>CurrAmt</TH>
<TH>BUMonth</TH>
<TH>BUYear</TH></TR>
<TR>
<TD>1</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $9,700.00 </TD>
<TD>1</TD>
<TD>2015</TD></TR>
<TR>
<TD>2</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $19,437.00 </TD>
<TD>2</TD>
<TD>2015</TD></TR>
<TR>
<TD>3</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $29,560.00 </TD>
<TD>3</TD>
<TD>2015</TD></TR>
<TR>
<TD>4</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $38,465.00 </TD>
<TD>4</TD>
<TD>2015</TD></TR>
<TR>
<TD>5</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $48,584.00 </TD>
<TD>5</TD>
<TD>2015</TD></TR>
<TR>
<TD>6</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $59,654.00 </TD>
<TD>6</TD>
<TD>2015</TD></TR>
<TR>
<TD>7</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $67,900.00 </TD>
<TD>7</TD>
<TD>2015</TD></TR>
<TR>
<TD>8</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $77,699.00 </TD>
<TD>8</TD>
<TD>2015</TD></TR>
<TR>
<TD>9</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $87,486.00 </TD>
<TD>9</TD>
<TD>2015</TD></TR>
<TR>
<TD>10</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $97,000.00 </TD>
<TD>10</TD>
<TD>2015</TD></TR>
<TR>
<TD>11</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $99,687.00 </TD>
<TD>11</TD>
<TD>2015</TD></TR>
<TR>
<TD>12</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $1,200.00 </TD>
<TD>1</TD>
<TD>2015</TD></TR>
<TR>
<TD>13</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $2,400.00 </TD>
<TD>2</TD>
<TD>2015</TD></TR>
<TR>
<TD>14</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $3,600.00 </TD>
<TD>3</TD>
<TD>2015</TD></TR>
<TR>
<TD>15</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $4,654.00 </TD>
<TD>4</TD>
<TD>2015</TD></TR>
<TR>
<TD>16</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $6,538.00 </TD>
<TD>5</TD>
<TD>2015</TD></TR>
<TR>
<TD>17</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $7,277.00 </TD>
<TD>6</TD>
<TD>2015</TD></TR>
<TR>
<TD>18</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $8,400.00 </TD>
<TD>7</TD>
<TD>2015</TD></TR>
<TR>
<TD>19</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $9,609.00 </TD>
<TD>8</TD>
<TD>2015</TD></TR>
<TR>
<TD>20</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $10,658.00 </TD>
<TD>9</TD>
<TD>2015</TD></TR>
<TR>
<TD>21</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $12,055.00 </TD>
<TD>10</TD>
<TD>2015</TD></TR>
<TR>
<TD>22</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $12,900.00 </TD>
<TD>11</TD>
<TD>2015</TD></TR></TBODY></table>
I need to break apart the running amount into monthly amounts so the table will look like
<table><TBODY>
<TR>
<TH>BUDataId</TH>
<TH>BU</TH>
<TH>AccountNum</TH>
<TH>Category</TH>
<TH>CurrAmt</TH>
<TH>BUMonth</TH>
<TH>BUYear</TH>
<TH>MonthlyAmt</TH></TR>
<TR>
<TD>1</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $9,700.00 </TD>
<TD>1</TD>
<TD>2015</TD>
<TD> $9,700.00 </TD></TR>
<TR>
<TD>2</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $19,437.00 </TD>
<TD>2</TD>
<TD>2015</TD>
<TD> $9,737.00 </TD></TR>
<TR>
<TD>3</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $29,560.00 </TD>
<TD>3</TD>
<TD>2015</TD>
<TD> $10,123.00 </TD></TR>
<TR>
<TD>4</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $38,465.00 </TD>
<TD>4</TD>
<TD>2015</TD>
<TD> $8,905.00 </TD></TR>
<TR>
<TD>5</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $48,584.00 </TD>
<TD>5</TD>
<TD>2015</TD>
<TD> $10,119.00 </TD></TR>
<TR>
<TD>6</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $59,654.00 </TD>
<TD>6</TD>
<TD>2015</TD>
<TD> $11,070.00 </TD></TR>
<TR>
<TD>7</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $67,900.00 </TD>
<TD>7</TD>
<TD>2015</TD>
<TD> $8,246.00 </TD></TR>
<TR>
<TD>8</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $77,699.00 </TD>
<TD>8</TD>
<TD>2015</TD>
<TD> $9,799.00 </TD></TR>
<TR>
<TD>9</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $87,486.00 </TD>
<TD>9</TD>
<TD>2015</TD>
<TD> $9,787.00 </TD></TR>
<TR>
<TD>10</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $97,000.00 </TD>
<TD>10</TD>
<TD>2015</TD>
<TD> $9,514.00 </TD></TR>
<TR>
<TD>11</TD>
<TD>12</TD>
<TD>AA</TD>
<TD>N91</TD>
<TD> $99,687.00 </TD>
<TD>11</TD>
<TD>2015</TD>
<TD> $2,687.00 </TD></TR>
<TR>
<TD>12</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $1,200.00 </TD>
<TD>1</TD>
<TD>2015</TD>
<TD> $1,200.00 </TD></TR>
<TR>
<TD>13</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $2,400.00 </TD>
<TD>2</TD>
<TD>2015</TD>
<TD> $1,200.00 </TD></TR>
<TR>
<TD>14</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $3,600.00 </TD>
<TD>3</TD>
<TD>2015</TD>
<TD> $1,200.00 </TD></TR>
<TR>
<TD>15</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $4,654.00 </TD>
<TD>4</TD>
<TD>2015</TD>
<TD> $1,054.00 </TD></TR>
<TR>
<TD>16</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $6,538.00 </TD>
<TD>5</TD>
<TD>2015</TD>
<TD> $1,884.00 </TD></TR>
<TR>
<TD>17</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $7,277.00 </TD>
<TD>6</TD>
<TD>2015</TD>
<TD> $739.00 </TD></TR>
<TR>
<TD>18</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $8,400.00 </TD>
<TD>7</TD>
<TD>2015</TD>
<TD> $1,123.00 </TD></TR>
<TR>
<TD>19</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $9,609.00 </TD>
<TD>8</TD>
<TD>2015</TD>
<TD> $1,209.00 </TD></TR>
<TR>
<TD>20</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $10,658.00 </TD>
<TD>9</TD>
<TD>2015</TD>
<TD> $1,049.00 </TD></TR>
<TR>
<TD>21</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $12,055.00 </TD>
<TD>10</TD>
<TD>2015</TD>
<TD> $1,397.00 </TD></TR>
<TR>
<TD>22</TD>
<TD>12</TD>
<TD>BB</TD>
<TD>N51</TD>
<TD> $12,900.00 </TD>
<TD>11</TD>
<TD>2015</TD>
<TD> $845.00 </TD></TR></TBODY></table>
I am sure there is a windowing function in here somewhere but not sure exactly where. Any help would be greatly appreciated
Upvotes: 1
Views: 54
Reputation: 28930
This works for all versions
with cte
as
(
select *,row_number() over (partition by yearr order by id) as rn
from test1_soe
)
select t1.*,isnull(t1.runamount-t2.runamount,t1.runamount) as nxt
from
cte t1
left join
cte t2
on
t1.rn=t2.rn+1
Upvotes: 1
Reputation: 13949
SQL 2012 has a LAG function that can give you the previous RunAmount
. Use this and subtract from the current RunAmount
to get your MonthAmt
SELECT *,
[RunAmount] - ISNULL(LAG([RunAmount]) OVER (ORDER BY [Year], [Month]),0) MonthAmt
FROM MyTable
the ISNULL
will give you a zero value for the first row since there is not a previous record, which would return null.
Upvotes: 2