我想创建一个 sql 语句来更新大量数据。
我有一个像这样的表
id, transid, amount, narative1, narative 2, total, active
1 1234 23.2 NULL NULL NULL 1
2 1234 120.33 NULL NULL NULL 1
3 1235 98.00 NULL NULL NULL 1
当有两行具有相同的 transid 时,我需要对它们进行总计,将结果放入具有该 transid 的第一行的总计列中,并将第二个金额放入第一个实例的 naritive2 中,并使第二个不活动.它应该忽略 transid 的单行。
我想做的结果应该是:
id, transid, amount, narative1, narative 2, total, active
1 1234 23.2 NULL 120.33 143.53 1
2 1234 120.33 NULL NULL NULL 0
3 1235 98.00 NULL NULL NULL 1
我知道一点丁字裤缠绕器但是..
理想情况下,我希望仅在 MySQL 语句中执行此操作。所以我不介意必须执行多个 sql 语句,但我想避免将它连接到 PHP 等。它是一个非常大的数据集。
最佳答案
这将只更新恰好有 2
行的交易(不是 1
也不是 3
或更多)。
UPDATE mytable mtu
JOIN (
SELECT minid, maxid, mtmin.amount AS minamt, mtmax.amount AS maxamt
FROM (
SELECT MIN(id) AS minid, MAX(id) AS maxid
FROM mytable mti
GROUP BY
transid
HAVING COUNT(*) = 2
) mt
JOIN mytable mtmin
ON mtmin.id = minid
JOIN mytable mtmax
ON mtmax.id = maxid
) mts
ON id IN (minid, maxid)
SET narative2 = CASE id WHEN minid THEN minamt ELSE NULL END,
total = CASE id WHEN minid THEN minamt + maxamt ELSE NULL END,
active = (id = minid)
关于MySQL 合并 2 行中的金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1073713/