我使用sql server作为后端来在asp.net c#中开发我的应用程序。现在我需要创建一个带有自动计算列(结算余额)的表,如下所示:
Date in stock out stock closing balance
2/3/2013 0 0 0
3/3/2013 10 5 5
5/3/2013 10 52 -37
6/3/2013 52 7 8
7/3/2013 6 50 -36
8/3/2013 10 12 -38
此处每天的期末余额取决于前一天的期末余额
例如,今天的收盘余额=(前一天的收盘余额+今天的收益率) - (今天的收益率) 当我在表格中添加一个日期为4/3/2013的新条目时,该表格必须如下所示
Date in stock out stock closing balance
2/3/2013 0 0 0
3/3/2013 10 5 5
4/3/2013 20 15 10
5/3/2013 10 52 -32
6/3/2013 52 7 13
7/3/2013 6 50 -31
8/3/2013 10 12 -33
我使用microsoft excel(使用公式)制作了这个,但我需要使用sql server table为我的应用程序实现它。任何帮助将不胜感激。
答案 0 :(得分:3)
<强>假设强>
1.你的表结构就像
Date | In Stock | Out Stock
2.在计算balance
之前,您将插入新列。
3.Date是Primary Column
(唯一+非空)
采取以上假设:
如果您想在 C#
中使用 SP1.使用 Rank()
创建临时表并指定Row Number
select
rank() OVER (ORDER BY [Date]) as [Rank],
t1.[Date],
t1.[in stock],
t1.[out stock]
--,t1.[in stock]-t1.[out stock] balance
into #temp1
from (your table name)
;
2.现在您将使用上述temp table
获取余额
WITH x AS
(
SELECT
[Rank],
[Date],
[in stock],
[out stock],
bal=([in stock]-[out stock])
FROM #temp1
WHERE [Rank] = 1
UNION ALL
SELECT
y.[Rank],
y.[Date],
y.[in stock],
y.[out stock],
x.bal+(y.[in stock]-y.[out stock])
FROM x INNER JOIN #temp1 AS y
ON y.[Rank] = x.[Rank] + 1
)
SELECT
[Date],
[in stock],
[out stock],
Balance = bal
FROM x
ORDER BY Date
OPTION (MAXRECURSION 10000);
以下是您可以验证的 SQL Fiddle 。
答案 1 :(得分:1)
在我看来,你不需要真正需要递归...
CREATE FUNCTION dbo.GetClosingBalance(@Date date) RETURNS int AS
BEGIN
DECLARE @RetVal int
SELECT
@RetVal = SUM([in stock]) - SUM([out stock])
FROM
x
WHERE
[Date] <= @Date
RETURN @RetVal
END
ALTER TABLE x ADD COLUMN [closing balance] AS (dbo.GetClosingBalance([Date]))