如何将一些行合并为一行,并删除其他行?
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_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
语句删除所有其他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。
我有一个 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_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
语句删除所有其他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。