SQL Server:减去相邻列分组
Posted
技术标签:
【中文标题】SQL Server:减去相邻列分组【英文标题】:SQL Server : deduct adjacent columns group by 【发布时间】:2015-02-28 18:43:51 【问题描述】:背后的逻辑是,我正在使用 s-s-rS 开发报告。我面临的问题是,在一张表上我有一个金额字段(在本例中为 A 列),而在另一张表上我有要扣除的金额(在本例中为 B 列)。
当我在报告 (s-s-rs) 上显示此记录时,它显示如下(第一个表),但他们正在寻找的输出是第二个。
工作原理: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
【问题讨论】:
您应该使用您正在使用的数据库标记您的问题。而且,您的输出毫无意义。小数位怎么了?请编辑您的问题并解释逻辑。 【参考方案1】:这应该可行。我添加了 ROW_NUMBER 以防 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
【讨论】:
谢谢。让我试试,然后回复你。 我还添加了使用 LAG 功能的附加解决方案,也许你会更喜欢它。以上是关于SQL Server:减去相邻列分组的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 SQL Server 中的分组列根据日期列的最近 3 个月获取列平均值?
SQL Server 动态行转列(参数化表名分组列行转列字段字段值)
SQL Server 动态行转列(参数化表名分组列行转列字段字段值)