如何在SQL表中新增列展示产品对应类型的分组总成本
实现方案
分两种场景实现,可根据你的实际需求选择:
场景1:仅查询时展示该字段(推荐)
不需要修改原表结构,直接用窗口函数动态计算即可,后续表内数据变更后查询结果会自动同步,不会出现数据不一致问题:
SELECT Product, Type, Cost, SUM(Cost) OVER (PARTITION BY Type) AS GroupsCost FROM 你的表名;
场景2:需要持久化新增字段存储该值
如果确实需要把GroupsCost字段固化存储到原表中,分两步操作:
第一步:新增字段
ALTER TABLE 你的表名 ADD COLUMN GroupsCost INT;
第二步:批量更新字段值
兼容绝大多数数据库的通用写法:
UPDATE 你的表名 t1 SET GroupsCost = ( SELECT SUM(Cost) FROM 你的表名 t2 WHERE t2.Type = t1.Type );
如果你使用MySQL 8.0+、PostgreSQL等支持关联更新的数据库,可以用更高性能的写法:
-- 以PostgreSQL为例 UPDATE 你的表名 t1 SET GroupsCost = t2.total_cost FROM ( SELECT Type, SUM(Cost) AS total_cost FROM 你的表名 GROUP BY Type ) t2 WHERE t1.Type = t2.Type;
注意:固化存储的GroupsCost不会随原表数据更新自动同步,后续增删改数据后需要手动更新该字段值,或配置触发器实现自动更新,若无特殊存储要求优先使用场景1的方案。
内容的提问来源于stack exchange,提问作者Alex Rudd
相关产品推荐
相关产品推荐

