You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何按Date、Name分组对cost求和后直接更新原表t1

报错原因

你编写的UPDATE语句无法运行是因为标准SQL的UPDATE语法不支持GROUP BY子句,且聚合函数SUM()不能直接在SET赋值环节作用于分组结果。同时你的需求不仅是修改cost字段值,还需要删除同Date+Name分组下的多余重复行,仅保留一行求和后的结果。

实现方案

操作前请先备份原表,避免数据丢失:

CREATE TABLE t1_backup AS SELECT * FROM t1;

方案1:直接修改原表(分更新+去重两步)

第一步:更新所有行的cost为对应分组的求和值

以MySQL为例语法如下,其他数据库可调整关联逻辑:

UPDATE t1 a
INNER JOIN (
    SELECT Date, Name, SUM(cost) AS total_cost
    FROM t1
    GROUP BY Date, Name
) b ON a.Date = b.Date AND a.Name = b.Name
SET a.cost = b.total_cost;
第二步:删除同分组下的重复行,仅保留1行

如果你的表没有主键,可先加临时自增列辅助去重:

  1. 新增临时自增列
ALTER TABLE t1 ADD COLUMN temp_id INT AUTO_INCREMENT PRIMARY KEY;
  1. 删除重复行,每个分组保留id最小的行
DELETE a FROM t1 a
JOIN t1 b 
ON a.Date = b.Date AND a.Name = b.Name AND a.temp_id > b.temp_id;
  1. 删除临时辅助列
ALTER TABLE t1 DROP COLUMN temp_id;

方案2:新表替换原表(更推荐,逻辑更简单不易出错)

虽然用到了SELECT查询,但本质是直接修改原表结构和内容,操作风险更低:

-- 新建存储聚合结果的表
CREATE TABLE t1_new AS SELECT Date, Name, SUM(cost) AS cost FROM t1 GROUP BY Date, Name;
-- 删除原表,将新表重命名为原表名
DROP TABLE t1;
ALTER TABLE t1_new RENAME TO t1;

内容的提问来源于stack exchange,提问作者Pablo Giovanni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:57:05