【问题标题】:Update Query with an Aggregate function on one table in SQL Server在 SQL Server 中的一个表上使用聚合函数更新查询
【发布时间】:2016-10-20 19:49:44
【问题描述】:

我知道这个问题可能已经得到解答,但我遇到的许多示例都涉及使用 INNER JOIN 将数据从一个表传输到另一个表,而我的情况有点不同。

基本上我想要做的就是把这个 SELECT 语句变成一个 Update 语句。

SELECT 
    SR, 100. * Cast(Round(AVG(Three_1 + Three_2 + Three_3 + Three_4 + Three_5 + Three_6 + Three_7 + Five_1 + Six_1 + Six_3) / 38,0) as int)
FROM 
    MainDB 
WHERE 
    Ctype = 'Call'
GROUP BY 
    SR

我能够成功计算我的一些列的百分比,然后我想用该信息更新列。我的第一次尝试是这样的

UPDATE QAMainDB 
SET TCX_score = 100. * avg(three_1 + Three_2 + Three_3 + Three_4 + Three_5 + Three_6 + Three_7 + Five_1 + Six_1 + Six_3) / 38

我得到了错误:

聚合可能不会出现在 UPDATE 语句的集合列表中。

在做了更多的尝试和错误之后,我尝试了这种方法来声明来自 Stack 上一个示例的变量。

Declare @Result Decimal = 0

SET @Result = 100. * Cast(round(avg(three_1 + Three_2 + Three_3 +  Three_4 + Three_5 + Three_6 + Three_7 + Five_1 + Six_1 + Six_3) / 38,0) as int)

UPDATE QAMainDB
SET TCX_score = @Result
WHERE Ctype = 'Call'

但它失败了,我想知道你们中的任何人是否可以通过引导我走向正确的方向来帮助我。我对 SQL 很陌生,所以请多多包涵。

感谢您的宝贵时间。

【问题讨论】:

    标签: sql-server tsql aggregate


    【解决方案1】:

    你如何匹配列?我猜SR是用于表之间匹配的列:

    WITH m as (
          SELECT SR, 100. * Cast(Round(AVG(Three_1 + Three_2 + Three_3 + Three_4 + Three_5 + Three_6 + Three_7 + Five_1 + Six_1 + Six_3) / 38,0) as int) as val
          FROM MainDB 
          WHERE Ctype = 'Call'
          GROUP BY SR
         )
    Update QAMainDB
        SET TCX_score = val
        FROM QAMainDB JOIN
             m
             ON m.SR = QAMainDB.SR;
    

    【讨论】:

    • 感谢您的快速响应,起初我使用 ID 来匹配列,但后来我出于不同的原因将其更改为 SR。无论如何,当我尝试使用上一个示例中的 INNER JOIN 技术时,我尝试了您的代码以及类似的东西,并且您的代码遇到了同样的错误。
    • 没有为“m”的第 2 列指定列名。
    • 感谢它在管理工作室中运行后的工作。我正在使用 VS Studio 对象资源管理器。
    【解决方案2】:

    尝试将您的代码更改为这个。

    Update QAMainDB SET  TCX_score = (select 100. * avg(three_1 + Three_2 + Three_3 + Three_4 + Three_5 + Three_6 + Three_7 + Five_1 + Six_1 + Six_3) / 38)
    

    【讨论】:

    • 嘿,兄弟,感谢您的快速响应,我也尝试了您的解决方案,并得到了与以前相同的错误。聚合可能不会出现在 UPDATE 语句的集合列表中。
    • update m_produk set harga = (select 100*avg(old.harga+200)/5) where id = 1
    • 对不起,我的意思是,更新 m_produk set harga = (select 100*avg(harga+200)/5) where id = 1
    • 感谢它在管理工作室中运行后的工作。我使用的是 VS Studio 对象资源管理器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多