SQL Server:按组扣除相邻列
背后的逻辑是,我正在使用SSRS开发一份报告。我面临的问题是,在一个表上我有一个金额字段(在本例中为A列),在另一个表上我有要扣除的金额(在本例中为B列) 当我在一个报告(ssrs)上显示这些记录时,它显示为如下(第一个表),但他们要查找的输出是第二个 工作原理:A列是A-B(6.000-2.000)的结果,第一列除外,该结果(6.000-2.000=4.000)将设置在A上 我现在所拥有的: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
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
你应该用你正在使用的数据库标记你的问题。而且,您的输出毫无意义。小数位是怎么回事?请编辑您的问题并解释逻辑。谢谢。让我试试,然后再给你们回复。我还添加了使用滞后函数的附加解决方案,也许你们会更喜欢它。