sql - 使用 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 不会在重置后添加到运行总计中。对困惑感到抱歉。
解决方案
您可以在查询中使用 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 |
推荐阅读
- electron - 使用电子打包程序时出现 ECONNRESET 错误
- node.js - cartItems.map 不是 Redux 中的函数
- ios - 如何从 iOS 中的另一个应用程序访问一个应用程序数据?
- reactjs - React 无法记住组件状态
- applescript - Apple Script Editor 防止 QuickTime 全屏打开
- apache-kafka - kafka 摄取不同主题的数据
- python - pandas str 到 datetime 转换错误(60 分钟字段) ParserError: minute must be in 0..59: 2015-04-24 12:60:46
- html - 如何将隐藏输入的值传递给 Vue 实例的 data() 属性
- java - flink table api 日 年 月 提取
- python - 将正常的 for 循环结构转换为列表理解结构