微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将某些行合并为一行,并删除其他行?

如何解决如何将某些行合并为一行,并删除其他行?

我有一张这样的桌子:

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_idproduct_id 组合更新行与最小 id 以及总计 quantitytotal

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 举报,一经查实,本站将立刻删除。