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行
如果你的表没有主键,可先加临时自增列辅助去重:
- 新增临时自增列
ALTER TABLE t1 ADD COLUMN temp_id INT AUTO_INCREMENT PRIMARY KEY;
- 删除重复行,每个分组保留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;
- 删除临时辅助列
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
相关产品推荐
相关产品推荐

