SQL Server:按组扣除相邻列

SQL Server:按组扣除相邻列,sql,sql-server,reporting-services,view,Sql,Sql Server,Reporting Services,View,背后的逻辑是,我正在使用SSRS开发一份报告。我面临的问题是,在一个表上我有一个金额字段(在本例中为A列),在另一个表上我有要扣除的金额(在本例中为B列) 当我在一个报告(ssrs)上显示这些记录时,它显示为如下(第一个表),但他们要查找的输出是第二个 工作原理:A列是A-B(6.000-2.000)的结果,第一列除外,该结果(6.000-2.000=4.000)将设置在A上 我现在所拥有的: id A B ----------------- 1 6.000

背后的逻辑是,我正在使用SSRS开发一份报告。我面临的问题是,在一个表上我有一个金额字段(在本例中为A列),在另一个表上我有要扣除的金额(在本例中为B列)

当我在一个报告(ssrs)上显示这些记录时,它显示为如下(第一个表),但他们要查找的输出是第二个

工作原理:A列是A-B(6.000-2.000)的结果,第一列除外,该结果(6.000-2.000=4.000)将设置在A上

我现在所拥有的:

id  A       B       
-----------------
1   6.000   2.000   
2   6.000   1.000   
3   6.000   2.000   
4   6.000   1.000   
预期产量

id  A       B       C
-------------------------
1   6.000   2.000   4.000 
2   4.000   1.000   3.000
3   3.000   2.000   1.000
4   1.000   1.000   0.000

这应该行得通。我添加了行号,以防ID之间出现一些间隙。如果没有-只需忽略它,并在此场景中使用您的id字段

DECLARE @data TABLE
(
    id INT
    , A FLOAT
    , B FLOAT
);

INSERT INTO @data
    (id, A, B)
VALUES
      (1, 6.000, 2.000)
    , (2, 6.000, 1.000)
    , (3, 6.000, 2.000)
    , (4, 6.000, 1.000)
    , (6, 5.000, 1.000);

;WITH ordered (rn, id, A, B)
AS (
    SELECT ROW_NUMBER() OVER(ORDER BY id) AS rn, id, A, B
    FROM @data
),
cte
AS (
    SELECT rn, id, A, B, A-B AS C
    FROM ordered
    WHERE rn = 1

    UNION ALL

    SELECT T.rn, T.id, C.C, T.B, C.C - T.B
    FROM ordered AS T
    INNER JOIN cte AS C
        ON c.rn + 1 = T.rn
)
SELECT *
FROM cte
使用分析函数的其他示例:

;WITH ordered (previous_id, id, A, B)
AS (
    SELECT LAG(id) OVER(ORDER BY id) , id, A, B
    FROM @data
),
cte
AS (
    SELECT previous_id, id, A, B, A-B AS C
    FROM ordered
    WHERE previous_id IS NULL

    UNION ALL

    SELECT T.previous_id, T.id, C.C, T.B, C.C - T.B
    FROM ordered AS T
    INNER JOIN cte AS C
        ON c.id = T.previous_id
)
SELECT id, A, B, C
FROM cte
rn  id  A   B   C
------------------
1   1   6   2   4
2   2   4   1   3
3   3   3   2   1
4   4   1   1   0
5   6   0   1   -1
输出:

;WITH ordered (previous_id, id, A, B)
AS (
    SELECT LAG(id) OVER(ORDER BY id) , id, A, B
    FROM @data
),
cte
AS (
    SELECT previous_id, id, A, B, A-B AS C
    FROM ordered
    WHERE previous_id IS NULL

    UNION ALL

    SELECT T.previous_id, T.id, C.C, T.B, C.C - T.B
    FROM ordered AS T
    INNER JOIN cte AS C
        ON c.id = T.previous_id
)
SELECT id, A, B, C
FROM cte
rn  id  A   B   C
------------------
1   1   6   2   4
2   2   4   1   3
3   3   3   2   1
4   4   1   1   0
5   6   0   1   -1

你应该用你正在使用的数据库标记你的问题。而且,您的输出毫无意义。小数位是怎么回事?请编辑您的问题并解释逻辑。谢谢。让我试试,然后再给你们回复。我还添加了使用滞后函数的附加解决方案,也许你们会更喜欢它。