求助:如何基于另一张表更新SQL表的sum_ok与avg_ok字段
解决基于t1更新t2汇总字段的SQL问题
需要根据t1的明细数据,按A、C分组统计status='OK'的数量(sum_ok)和对应数值的平均值(avg_ok),更新到t2的对应字段。
原代码的错误点
- 引用错误字段:
SET子句中使用t2.[status],但t2是汇总表,不存在status字段,应基于t1的status计算。 - 关联条件不完整:注释掉了
t1.C = t2.C,导致无法精准匹配t2中A、C对应的分组行。 - 聚合函数使用方式错误:直接在
UPDATE语句中搭配GROUP BY不符合SQL语法规则,需先通过子查询预计算聚合结果。 - 平均值逻辑错误:试图对字符串类型的
status取平均,应针对t1中的数值字段(如B列),仅统计status='OK'的记录的平均值。
正确的SQL代码
UPDATE t2 SET t2.sum_ok = agg.sum_ok, t2.avg_ok = agg.avg_ok FROM t2 INNER JOIN ( -- 预计算每个A、C分组的sum_ok和avg_ok SELECT A, C, SUM(CASE WHEN status = 'OK' THEN 1 ELSE 0 END) AS sum_ok, -- 仅对status为OK的记录计算数值字段的平均值(示例用B列,可根据实际表结构替换) AVG(CASE WHEN status = 'OK' THEN B ELSE NULL END) AS avg_ok FROM t1 WHERE C IS NOT NULL GROUP BY A, C ) AS agg ON t2.A = agg.A AND t2.C = agg.C
补充说明
如果t1中用于计算平均值的字段不是B,可根据实际表结构替换为对应数值字段;该语法适用于SQL Server,若为其他数据库(如MySQL),语法会略有调整,但核心逻辑一致——先聚合明细数据,再关联更新汇总表。
内容的提问来源于stack exchange,提问作者crist_9
相关产品推荐
相关产品推荐

