繁体   English   中英

SQL 服务器使用 GROUP BY 和总和条件以及特定值更新列中的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM