自动根据prevoius行数据计算在一个SQL表中的列(Auto calculating colum

2019-08-22 00:50发布

我使用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

这里每一天的收盘平衡取决于前一天的期末余额

例如,今天的期末余额=(前一交易日收盘余额+今天的inStock) - (今天的脱销)当我添加日期2013年4月3日到表的新条目,该表必须如下图所示

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

Answer 1:

假设

1.您的表结构是一样

Date | In Stock | Out Stock

2.You将计算前插入一个新列 balance

3.Date是一个Primary Column唯一+ NOT NULL)

以上面的假设:

你必须做一个SP,如果你想在C#中使用

1.创建一个临时表 ,并分配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.Now你会使用上述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小提琴 ,你可以验证。



Answer 2:

在我看来,像你并不需要真的需要递归...

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]))


文章来源: Auto calculating columns in a sql table based on prevoius row data