基于先前的行数据自动计算sql表中的列

时间:2013-04-11 18:16:42

标签: sql sql-server sql-server-2008 tsql

我使用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为我的应用程序实现它。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

<强>假设

1.你的表结构就像

Date | In Stock | Out Stock

2.在计算balance之前,您将插入新列

3.Date是Primary Column唯一+非空

采取以上假设:

如果您想在 C#

中使用 SP

1.使用 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]))