MySQL如何将列的值添加到一起并删除重复的行?
你好 我有一个MySQL表,其中有一些重复的行,在将重复行中的一列中的值添加到原始行时,必须删除这些重复行 这个问题是由另一列的值错误引起的,现在已经解决了,但它使余额在不同的行之间分开,这些行必须相加。然后必须删除添加的较新行MySQL如何将列的值添加到一起并删除重复的行?,mysql,sql,Mysql,Sql,你好 我有一个MySQL表,其中有一些重复的行,在将重复行中的一列中的值添加到原始行时,必须删除这些重复行 这个问题是由另一列的值错误引起的,现在已经解决了,但它使余额在不同的行之间分开,这些行必须相加。然后必须删除添加的较新行 ID | balance | userid --------------------- 1 | 10 | 1 2 | 15 | 2 3 | 300 | 3 4 | 80 | 4 5 | 0 | 5 6 | 6
ID | balance | userid
---------------------
1 | 10 | 1
2 | 15 | 2
3 | 300 | 3
4 | 80 | 4
5 | 0 | 5
6 | 65 | 6
7 | 178 | 7
8 | 201 | 8
9 | 92 | 9
10 | 0 | 10
11 | 140 | 3
12 | 46 | 6
13 | 30 | 3
在本例中,userid列确定它们是否重复(或三次)。用户标识6重复,用户标识3重复三次
以userid 3为例,它必须将第3行、第11行和第13行中的所有余额相加,然后将总数放入第3行,然后删除第11行和第13行。这两个行的平衡列必须一起添加到原始的低ID行中,新的高ID行必须删除
ID | balance | userid
---------------------
1 | 10 | 1
2 | 15 | 2
3 | 300 | 3
4 | 80 | 4
5 | 0 | 5
6 | 65 | 6
7 | 178 | 7
8 | 201 | 8
9 | 92 | 9
10 | 0 | 10
11 | 140 | 3
12 | 46 | 6
13 | 30 | 3
我希望这足够清楚,并且我已经提供了足够的信息。谢谢=)
应该可以,但注释“修复表”确实是最好的方法。您可以创建具有相同结构的表,并使用此查询将数据传输到该表
insert into newPriceTable(id, userid, balance)
select u.id, p.userid, sum(balance) as summation
from price p
join (
select userid, min(id) as id from price group by userid
) u ON p.userid = u.userid
group by p.userid
在这里绕过查询:工作主要在MSSQL中完成,但您应该能够转换语法 使用GROUP BY UserID,您可以对余额求和(),将其连接回主表,以更新所有重复项的余额。最后,您可以使用RANK()对重复的用户标识进行排序,并仅保留最早的值 我会将所有这些都选择到一个新表中,如果它看起来不错,就弃用旧表,然后重命名新表 两个步骤 1。更新:
UPDATE
tableX AS t
JOIN
( SELECT userid
, MIN(id) AS min_id
, SUM(balance) AS sum_balance
FROM tableX
GROUP BY userid
) AS c
ON t.userid = c.userid
SET
t.balance = CASE WHEN t.id = c.min_id
THEN c.sum_balance
ELSE 0
END ;
DELETE t
FROM
tableX AS t
JOIN
( SELECT userid
, MIN(id) AS min_id
FROM tableX
GROUP BY userid
) AS c
ON t.userid = c.userid
AND t.id > c.min_id
WHERE
t.balance = 0 ;
2。删除多余的行:
UPDATE
tableX AS t
JOIN
( SELECT userid
, MIN(id) AS min_id
, SUM(balance) AS sum_balance
FROM tableX
GROUP BY userid
) AS c
ON t.userid = c.userid
SET
t.balance = CASE WHEN t.id = c.min_id
THEN c.sum_balance
ELSE 0
END ;
DELETE t
FROM
tableX AS t
JOIN
( SELECT userid
, MIN(id) AS min_id
FROM tableX
GROUP BY userid
) AS c
ON t.userid = c.userid
AND t.id > c.min_id
WHERE
t.balance = 0 ;
解决此问题后,最好在
userid
上添加UNIQUE
约束,因为您似乎希望在此处存储每个用户的余额。这将避免将来出现任何重复。您还可以删除(无用?id
列。将其导出到excel。让它看起来正确。然后截断该表,并将其从现在正确的excel文件中以正确的方式放回。确保在处理iThanks时表没有任何更改,但不幸的是我不能这样做。表中的余额不断调整。因此,我认为一个纯粹的MySQL方法会是最好的。这只是向我展示了所有用户的平衡。这并不能解决我的问题。谢谢你的帮助谢谢你的回复。我不知道MSSQL,所以我不知道如何转换。另外,我不能真的放弃这个表,因为它是活动的。我不能用新表的设置方式。它可能会起作用,尽管不是这样。谢谢。太棒了,这太完美了。谢谢=)