【问题标题】:Update column value with sum of a column from records of a different table使用来自不同表的记录的列的总和更新列值
【发布时间】:2021-09-04 20:50:15
【问题描述】:

我有两张表 payroll_est_act,actual_payroll_history

payroll_est_act

id| location_id     | type          | amt
-------------------------------------------
1 | 1               |  Actual       | 36000  
2 | 1               |  Estimated    | 20000   
3 | 2               |  Actual       | 50000  
4 | 2               |  Estimated    | 50000 
5 | 3               |  Actual       | 24000  
6 | 3               |  Estimated    | 18000 


actual_payroll_history

id  |  payroll_est_act_id   | amt       | date
-----------------------------------------------------
1   |   1                   |   4000    |   1 June 20
2   |   1                   |   4000    |   1 July 20
3   |   1                   |   4000    |   1 Aug 20
4   |   1                   |   4000    |   1 Sep 20
5   |   2                   |   12500   |   1 June 20
6   |   2                   |   12500   |   1 July 20
7   |   2                   |   12500   |   1 Aug 20
8   |   2                   |   12500   |   1 Sep 20
9   |   3                   |   4000    |   1 June 20

如果 payroll_est_act 中的 amt 值与 actual_payroll_history 中的 amt 总和不匹配,我想编写一条更新语句,以使用来自 actual_payroll_history 的相应 payroll_est_act_id 的金额总和来更新“实际”类型的 payroll_est_act 中的金额。

请帮忙。 谢谢

【问题讨论】:

    标签: sql sql-server tsql sql-update


    【解决方案1】:

    我会在这里使用可更新的 CTE:

    WITH cte1 AS (
        SELECT payroll_est_act_id, SUM(amt) AS amt_actual
        FROM actual_payroll_history
        GROUP BY payroll_est_act_id
    ),
    cte2 AS (
        SELECT p.amt, t.amt_actual
        FROM payroll_est_act p
        INNER JOIN cte1 t
            ON t.payroll_est_act_id = p.location_id
        WHERE p.type = 'Actual'
    )
    
    UPDATE cte2
    SET amt = amt_actual
    WHERE amt <> amt_acutal;
    

    【讨论】:

    • 这行得通,但是如果我从 cte2 中选择只是为了检查记录,我会收到一个错误 - “无法将 char 值转换为货币。char 值的语法不正确。”在 SELECT payroll_est_act_id, SUM(amt) AS amt_actual 上,我该如何避免这种情况?
    • 在不知道您的确切数据和表定义的情况下,我只能推测。听起来SUM() 引起了这个问题,可能是因为您正在尝试对字符数据求和。
    • 我的错,我为 p.type = 'actual' 使用了一些不同的列,谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2020-10-13
    • 2023-03-12
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多