3

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

4

2 回答 2

3

假设

1.你的表结构是这样的

Date | In Stock | Out Stock

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

3.日期是一个Primary Column唯一+非空

采取上述假设:

如果你想在C#中使用,你已经制作了一个SP

1.创建一个临时表Row Number并使用Rank()分配

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 。

于 2013-04-12T11:14:17.237 回答
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]))
于 2013-11-08T11:21:34.080 回答