如何解决如何将某些行合并为一行,并删除其他行?
我有一张这样的桌子:
id | invoice_id | product_id | quantity | total
1 5 10 2 100
2 5 10 1 50
3 5 11 1 200
4 5 11 1 200
我想合并发票中具有相同 product_id 的行,方法是将它们的数量和总值添加到其中一行,然后删除表中的其他行。所以输出应该是这样的
id | invoice_id | product_id | quantity | total
1 5 10 3 150
3 5 11 2 400
我该怎么做?我正在考虑使用一个 sql 函数,该函数返回具有相同发票和产品的 id 列表,然后使用数量和价格的聚合函数。有没有更简单的方法来做到这一点?
解决方法
首先,您需要一个 UPDATE
语句,为每个 invoice_id
、product_id
组合更新行与最小 id
以及总计 quantity
和total
:
UPDATE tablename t
SET quantity = s.quantity,total = s.total
FROM (
SELECT MIN(id) id,SUM(quantity) quantity,SUM(total) total
FROM tablename
GROUP BY invoice_id,product_id
) s
WHERE s.id = t.id;
然后使用 DELETE
语句删除所有其他 ID:
DELETE FROM tablename t1
WHERE t1.id > (
SELECT MIN(t2.id)
FROM tablename t2
WHERE t2.invoice_id = t1.invoice_id AND t2.product_id = t1.product_id
);
参见demo。
这看起来像一个聚合查询:
select min(id) as id,invoice_id,product_id,sum(quantity) as quantity,sum(total) as total
from t
group by invoice_id,product_id;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。