Sql server 使用下一行中的计算字段。比如说跑全速

Sql server 使用下一行中的计算字段。比如说跑全速,sql-server,calculated-columns,cumulative-sum,Sql Server,Calculated Columns,Cumulative Sum,我有一个具有以下结构的表: 1) 罗诺 2) BillValue 3) 平衡 4) X=(我的计算字段) 表格的填写版本如下所示: RowNo BillValue Balance X 1 9689454 9689454 2 812,500 8876954 8876954 3 741,343 8135611 8135611 4 838,430 7297181 7297181 5 1,297,15

我有一个具有以下结构的表:

1) 罗诺

2) BillValue

3) 平衡

4) X=(我的计算字段)

表格的填写版本如下所示:

RowNo  BillValue  Balance  X
1                 9689454  9689454
2      812,500    8876954  8876954
3      741,343    8135611  8135611
4      838,430    7297181  7297181
5      1,297,151  6000030  6000030
6      1,425,398  6648632  4574632
7      1,022,478  5626154  3552154
8      587,560    5038594  2964594
9      674,655    4363939  2289939
10     355,005    4008934  1934934
11     1,113,673  2895261  821261
12     759,961    2135300  61300
13     61,300     1271654  0 
第一个“X”值=余额(我称之为X1,这意味着X与RowNo=1一起归档)

X2=X1–BillValue

X3=X2–BillValue

最后:
X(n)=X(n-1)–BillValue

这些问题让我想起了跑步。然而,这是不同的。 请自行考虑加入表,并使用以下类似的查询:

FROM 
    C1
LEFT JOIN
    C1 C2 ON C1.RowNo = C2.RowNo + 1
我们在第一步计算所有的x,这是错误的。计算后,X必须移动到下一行


在SQL Server 2012及更高版本中,不使用游标的最佳方式是什么?

编辑1:根据评论添加了StdID

编辑2:修改脚本以始终使用余额的第一个值而不是最大值

这可以在不使用任何联接的情况下使用以下脚本完成:

CREATE TABLE #Order(
    StdID INT,
    RowNo INT IDENTITY(1,1),
    BillValue NUMERIC(10,2),
    Balance NUMERIC(10,2)
);

INSERT INTO #Order(StdID,BillValue,Balance)
VALUES
(1,0,1000),
(1,500,1200),
(1,100,900),
(1,200,700),
(1,100,600),
(2,0,2000),
(2,1000,1200),
(2,500,2500),
(2,400,700),
(2,100,600)

SELECT  StdID,
        RowNo,
        BillValue,
        Balance,
        (FIRST_VALUE(Balance) OVER (PARTITION BY STDID ORDER BY RowNo)-SUM(BillValue) OVER(PARTITION BY STDID ORDER BY RowNo)) AS X
FROM #Order;

DROP TABLE #Order;

您可以使用以下查询:

SELECT t1.RowNo, t1.BillValue, t1.Balance,
       t2.Balance - SUM(t1.BillValue) OVER (ORDER BY RowNo) AS X
FROM mytable AS t1
CROSS JOIN (SELECT Balance FROM mytable WHERE RowNo = 1) AS t2
交叉连接
操作用于获取初始行的
余额
值。使用此值,我们可以通过减去field
BillValue
的运行总数来计算field
X
。使用函数
SUM
的窗口版本以及
ORDER BY
子句,可以轻松计算运行总数。此版本的
SUM
从SQL Server 2012开始提供。

您可以创建以下表格:

CREATE TABLE [dbo].[Bills](
    RowNo int IDENTITY(1,1) NOT NULL,
    BillValue int NOT NULL,
    Balance int NOT NULL
) 
然后创建视图

CREATE VIEW dbo.BillsX
AS
WITH cte AS (
    SELECT *, Balance as X, 1 as lev
    FROM dbo.Bills
    WHERE RowNo = 1
    UNION ALL
    SELECT b.*, (LAG(c.X,0,0) OVER (ORDER BY lev))- b.BillValue, lev+1 
    FROM cte c
    INNER JOIN dbo.Bills b
        ON b.RowNo = c.RowNo +1
)

SELECT  RowNo,
        BillValue,
        Balance,
        X
FROM cte

使用滞后和超前是个好主意。但是,在这种情况下,第一个X值保持为NULL,这意味着X1的值错误。您希望第一个X1的值是什么?请检查更新的ans,以使用ISNULL显示X1的平衡。这很好,如果所有平衡值都按顺序描述,则仍有错误。这很好,如果所有余额值都按DESC顺序排列,则仍有一个错误。如果第三个值是这样(2001100),则无法正常工作。其次,我需要在一个有stID的表上运行这个查询。这意味着我需要每个stID的结果