[英]SQL Server Update value in a column with GROUP BY and condition of sum and a specific value
任务 | 类型 | 数量 | 注释 |
---|---|---|---|
1018140292 | 南非 | 14.51 | 货币差异 |
1018140292 | 房车 | -16.56 | 货币差异 |
场景:如果具有相同 Assignment 的多个行项目的 Amount 列值的总和在 (-10) - (+10) 范围内,我需要更新数据库中的 Comments 列。 数据将按分配列分组。 但是,我遇到了一个挑战,当我们分组时,如果作业包含带有“SA”和“RV”的列类型,我们只能总结。
以下是我尝试过的查询。
update tbl_NO300_Details
set Comments='Currency Variance'
where Assignment in(
select Assignment
from tbl_NO300_Details Intbl where Type in ('RV', 'SA')
group by Intbl.Waybill,right(Shipment_Date,7 )
having count(*)>1 and sum(cast(Amount as float))>-10 and sum(cast(LC_Amount as float))<10)
问题:
当我遇到只有 SA 的多行的情况时,它也会用不正确的“货币变化”更新评论列。 在这种情况下,我们需要有“RV”和“SA”。
任务 | 类型 | 数量 | 注释 |
---|---|---|---|
1018140292 | 南非 | 5.00 | 货币差异 |
1018140292 | 南非 | 4.00 | 货币差异 |
正确的 output 应该是,它不会更新 Comments 列(应该是空白):
任务 | 类型 | 数量 | 注释 |
---|---|---|---|
1018140292 | 南非 | 5.00 | |
1018140292 | 南非 | 4.00 |
感谢您是否可以帮助解决我的问题。
谢谢你。
您可以使用窗口条件聚合来进行计算。
在 CTE 或派生表中执行此操作,并通过它直接更新。
UPDATE t
SET Comments = 'Currency Variance'
FROM (
SELECT *,
countRV = COUNT(CASE WHEN Type = 'RV' THEN 1 END)
OVER (PARTITION BY Intbl.Waybill, RIGHT(Shipment_Date, 7)),
countSA = COUNT(CASE WHEN Type = 'SA' THEN 1 END)
OVER (PARTITION BY Intbl.Waybill, RIGHT(Shipment_Date, 7)),
sm = SUM(CASE WHEN Type IN ('RV', 'SA') THEN Amount END)
OVER (PARTITION BY Intbl.Waybill, RIGHT(Shipment_Date, 7))
FROM tbl_NO300_Details Intbl
) t
WHERE countRV > 0 AND countSA > 0
AND sm > -10 AND sm < 10
笔记:
- 如果不需要,请不要转换为浮动。 如果您需要将字符串转换为数字,请尽可能转换为
decimal
- 不清楚
RIGHT(Shipment_Date, 7)
的用途。 如果您试图从datetime
时间值中删除时间,这不是这样做的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.