Sql server 使用下一行中的计算字段。比如说跑全速
我有一个具有以下结构的表: 1) 罗诺 2) BillValue 3) 平衡 4) X=(我的计算字段) 表格的填写版本如下所示: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
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
交叉连接
操作用于获取初始行的余额
值。使用此值,我们可以通过减去fieldBillValue
的运行总数来计算fieldX
。使用函数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的结果