[英]sql get previous row value for a running total
I have a query that is already calculating a running total for new clients and clients that have left. 我有一个查询,已经在为新客户端和已离开的客户端计算运行总计。 However if there are no new clients or no clients have left when I try to plot this on a graph I get blank spaces. 但是,如果在尝试将其绘制在图形上时没有新客户或没有客户离开,则会出现空格。
How can I get the previous years figures if a year is null? 如果一年为空,如何获得前几年的数字?
select x.Year
, case when x.TotalClients is null then 0 else x.TotalClients end as 'TotalNewClients'
, x.RunningTotal as 'RunningTotalNewClients'
, case when x2.TotalClients is null then 0 else x2.TotalClients end as 'TotalLeftClients'
, x2.RunningTotal as 'RunningTotalLeftClients'
from (
SELECT
st1.YearStart as 'Year',
st1.TotalClients,
RunningTotal = SUM(st2.TotalClients)
FROM
@TotalsStart AS st1
INNER JOIN
@TotalsStart AS st2
ON st2.YearStart <= st1.YearStart
GROUP BY st1.YearStart, st1.TotalClients) as x
left outer join
(SELECT
st1.YearStart as 'Year',
st1.TotalClients,
RunningTotal = SUM(st2.TotalClients)
FROM
@TotalsEnd AS st1
INNER JOIN
@TotalsEnd AS st2
ON st2.YearStart <= st1.YearStart
GROUP BY st1.YearStart, st1.TotalClients
) as x2 on x.Year = x2.Year
Order by x.Year
滞后功能(msdn.microsoft.com/en-us/library/hh231256.aspx)也许可以帮助您?
This was my amended code, I changed 2 lines in the select to use the lag function, I used the link in my answer to get this working. 这是我的修改代码,我在select中更改了2行以使用lag函数,并在答案中使用了链接以使其正常工作。
select x.Year
, case when x.TotalClients is null then 0 else x.TotalClients end as 'TotalNewClients'
, x.RunningTotal
, case when x.RunningTotal is null then lag(x.RunningTotal,1,0) over(order by x.year) else x.RunningTotal end as 'RunningTotalNewClients'
, case when x2.TotalClients is null then 0 else x2.TotalClients end as 'TotalLeftClients'
, x2.RunningTotal
, case when x2.RunningTotal is null then lag(x2.RunningTotal,1,0) over(order by x.year) else x2.RunningTotal end as 'RunningTotalLeftClients'
from (
SELECT
st1.YearStart as 'Year',
st1.TotalClients,
RunningTotal = SUM(st2.TotalClients)
FROM
@TotalsStart AS st1
INNER JOIN
@TotalsStart AS st2
ON st2.YearStart <= st1.YearStart
GROUP BY st1.YearStart, st1.TotalClients) as x
left outer join
(SELECT
st1.YearStart as 'Year',
st1.TotalClients,
RunningTotal = SUM(st2.TotalClients)
FROM
@TotalsEnd AS st1
INNER JOIN
@TotalsEnd AS st2
ON st2.YearStart <= st1.YearStart
GROUP BY st1.YearStart, st1.TotalClients
) as x2 on x.Year = x2.Year
Order by x.Year
Your query is way to complicated if you are using SQL Server 2012+. 如果使用的是SQL Server 2012+,查询将变得很复杂。 Just use the cumulative sum functionality: 只需使用累积和功能:
select coalesce(x.Year, x2.year) as year,
coalesce(x.TotalClients, 0 ) as TotalNewClients,
x.RunningTotal as RunningTotalNewClients
coalesce(x2.TotalClients, 0) as TotalLeftClients,
x2.RunningTotal as RunningTotalLeftClients
from (SELECT st.YearStart as Year, st.TotalClients,
SUM(st.TotalClients) over (order by year) as RunningTotal
FROM @TotalsStart st
) x full outer join
(SELECT st.YearStart as Year, st.TotalClients,
SUM(st.TotalClients) over (order by year) as RunningTotal
FROM @TotalsEnd AS st
) x2
on x.Year = x2.Year
Order by coalesce(x.Year, x2.year);
Even in earlier versions of SQL Server, apply
is a better method for getting cumulative sums than join
with group by
. 即使在SQL Server的早期版本中, apply
也是一种比使用group by
join
来获取累计总和的更好方法。
By the way, you should use single quotes only for string and date constants, not for column aliases. 顺便说一句,您应该仅对字符串和日期常量使用单引号,而不对列别名使用单引号。 Although allowed in that context, they generally lead to confusion and hard-to-find errors in the query. 尽管在这种情况下允许使用,但它们通常会导致查询混乱和难以发现的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.