首页 > 解决方案 > 使用 PARTITION BY 和 ORDER 添加数字

问题描述

我有一个案例,我想在运行总计语句中添加一个数字。我的运行总计语句在这里(我在几个小时前问过这个问题,因为当参考值为零时,我的运行总计需要为零)。

我尝试了很多步骤,但我被卡住了..

这是我的数据:

Create table Net_Cash(
  ID int IDENTITY  primary key,
  MO int,
  YR int,
  LC decimal(6,2)
);


insert into Net_Cash values  
                            (1, 2011, 56.23),
                            (2, 2011, 881.4),
                            (3, 2011, 195.09),
                            (4, 2011, 522.9),
                            (5, 2011, 0),
                            (6, 2011, 355.66),
                            (7, 2011, 0),
                            (8, 2011, 344.86);

在此处输入图像描述

这是运行总计查询,如果其参考值为零,则运行总计将返回零:

SELECT MO, YR, 
       SUM(LC) OVER (PARTITION BY grp ORDER BY YR, MO) AS LC
FROM (SELECT nc.*,
             SUM(CASE WHEN LC = 0 THEN 1 ELSE 0 END) OVER (ORDER BY YR, MO) as grp
      FROM Net_Cash nc
     ) nc;

结果如下:

在此处输入图像描述

但是,当 LC 不为零时,我想在我的运行总 LC 中添加一个常数值。我尝试了不同的方法,但都错了..

SELECT MO, YR, 
       (SUM(LC) OVER (PARTITION BY grp ORDER BY YR, MO)) + 10 AS LC
FROM (SELECT nc.*,
             SUM(CASE WHEN LC = 0 THEN 1 ELSE 0 END) OVER (ORDER BY YR, MO) as grp
      FROM Net_Cash nc
     ) nc;

结果(当 LC 为零时仍添加 10):

在此处输入图像描述

尝试 2(根据 SQL Server 的语法不正确):

SELECT MO, YR, 
       SUM  (CASE WHEN LC = 0 THEN 0 ELSE 
            SUM(LC) OVER (PARTITION BY grp ORDER BY YR, MO) + 10
            ) AS LC
FROM (SELECT nc.*,
             SUM(CASE WHEN LC = 0 THEN 1 ELSE 0 END) OVER (ORDER BY YR, MO) as grp
      FROM Net_Cash nc
     ) nc;

尝试 3(根据 SQL Server,这再次具有不正确的语法):

SELECT MO, YR, 
       SUM(CASE WHEN LC = 0 THEN 0 ELSE LC + 10) OVER (PARTITION BY grp ORDER BY YR, MO) AS LC
FROM (SELECT nc.*,
             SUM(CASE WHEN LC = 0 THEN 1 ELSE 0 END) OVER (ORDER BY YR, MO) as grp
      FROM Net_Cash nc
     ) nc;

都是错的。我不知道如何正确添加它..

这是当前输出和预期输出:

当前的:

电流输出

编辑:预期:

预期产出

已编辑:第 6 个月和第 8 个月未添加 10,因为已重置运行总数。+10 仅适用于第一个运行总计。

在此先感谢您的帮助!

已编辑:我的 + 10 值只会添加到第一个(非零)运行总计中。由于我的运行总计将被重置,因此 + 10 不会在重置后添加到运行总计中。对困惑感到抱歉。

标签: sqlsql-server

解决方案


您可以在查询中使用 CASE 表达式,该表达式10仅在第一组的行中添加:

SELECT MO, YR, 
       SUM(LC) OVER (PARTITION BY grp ORDER BY YR, MO) + 
       CASE WHEN grp = 0 AND FIRST_VALUE(LC) OVER (PARTITION BY grp ORDER BY YR, MO) <> 0 THEN 10 ELSE 0 END AS LC
FROM (
  SELECT nc.*,
         SUM(CASE WHEN LC = 0 THEN 1 ELSE 0 END) OVER (ORDER BY YR, MO) as grp
  FROM Net_Cash nc
) nc;

请参阅演示
结果:

液相色谱
1 2011 66.23
2 2011 947.63
3 2011 1142.72
4 2011 1665.62
5 2011 0.00
6 2011 355.66
7 2011 0.00
8 2011 344.86

推荐阅读