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 动态行转列(参数化表名分组列行转列字段字段值)

获取 Sql-Server 中逗号分隔值中未分组列的详细信息

SQL Server - 在按特定列分组时构建动态范围的数字