首页 > 解决方案 > SQL Server 查询问题。示例在 excel 工作表图片中

问题描述

请看下面的图片,我想在 SQL Server 中转换这个公式。在excel表中

        M   N
    15  1   0
    16  3   1
    17  5   2
    18  8   4
    19  9   4


    N= IF(M16-M15<=1,N15,M16-M15-1+N15

请参阅截图以供参考:

SQL Server 中所需的 Excel 计算公式

标签: sql-serverexcellaglead

解决方案


根据您的标签,这可以通过 LAG 完成,然后进行总计。

  • 对于每一行,首先计算 M 与前一行的差异(使用 LAG) - 我称之为Dif_Last_M. 这反映了公式中的“M24-M23”部分。
  • 如果Dif_Last_M是 <= 1,则将 0 添加到运行总计(有效地使运行总计与上一行相同)
  • 否则,如果Dif_Last_M大于 1,则将 (Dif_Last_M减 1) 添加到运行总计中

以下是假设您的源表名为 #Temp 并具有 ID(排序值)的代码

WITH M_info AS
    (SELECT  ID, M, (M - LAG(M, 1) OVER (ORDER BY ID)) AS Dif_Last_M
        FROM #Temp
    )
SELECT  ID, 
        M, 
        SUM(CASE WHEN Dif_Last_M > 1 THEN Dif_Last_M - 1 ELSE 0 END) OVER (ORDER BY ID) AS N
FROM    M_info;

这是结果

ID  M   N
1   1   0
2   3   1
3   5   2
4   8   4
5   9   4
6   12  6
7   13  6

这是上面的db<>fiddle。它还包括显示的附加查询

  • CTE 的结果
  • 运行总计中使用的值

请注意,虽然递归 CTE 可以做到这一点,但它们往往存在性能问题(从根本上说,它们是循环)。因此,如果可能的话,避免递归 CTE 会更好(在性能方面)。


推荐阅读