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

How to combine some rows into a single row, and delete other rows?

我有一个 table 这样的:

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 的行,方法是将它们的数量和总值添加到其中一行,然后删除 table 中的其他行。所以输出应该是这样的

id | invoice_id | product_id | quantity | total
1         5           10           3        150
3         5           11           2        400

我该怎么做?我正在考虑使用一个 sql 函数,该函数 returns 具有相同发票和产品的 id 列表,然后在数量和价格上使用聚合函数。有没有更简单的方法来做到这一点?

这看起来像一个聚合查询:

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;

首先,您需要一个 UPDATE 语句来更新每个 invoice_idproduct_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语句删除所有其他ids:

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