如何解决将多行转换为同一表格中的单行按合并分组方式减少
嘿,我想减少我的桌子并更新自己(对一些列进行分组和求和,并删除行)
源表“ table_test”:
+----+-----+-------+----------------+
| id | qty | user | isNeedGrouping |
+----+-----+-------+----------------+
| 1 | 2 | userA | 1 | <- row to group + user A
| 2 | 3 | userB | 0 |
| 3 | 5 | userA | 0 |
| 4 | 30 | userA | 1 | <- row to group + user A
| 5 | 8 | userA | 1 | <- row to group + user A
| 6 | 6 | userA | 0 |
+----+-----+-------+----------------+
想要的表:(获得者)
DROP TABLE table_test_grouped;
SET @increment = 2;
CREATE TABLE table_test_grouped
SELECT id,SUM(qty) AS qty,user,isNeedGrouping
FROM table_test
GROUP BY user,IF(isNeedGrouping = 1,isNeedGrouping,@increment := @increment + 1);
SELECT * FROM table_test_grouped;
+----+------+-------+----------------+
| id | qty | user | isNeedGrouping |
+----+------+-------+----------------+
| 1 | 40 | userA | 1 | <- rows grouped + user A
| 3 | 5 | userA | 0 |
| 6 | 6 | userA | 0 |
| 2 | 3 | userB | 0 |
+----+------+-------+----------------+
问题:我可以使用另一个(临时)表,但是我想更新初始表:
这是一个最小的例子,我不希望从table_test_grouped中完全替换首字母,因为在我的情况下,我还有另一个专栏(isNeedGrouping)来决定是否分组。
对于标记为“ isNeedGrouping”的行,我需要分组。 对于此示例,一种方法是按顺序执行:
CREATE TABLE table_test_grouped SELECT id,isNeedGrouping FROM table_test WHERE isNeedGrouping = 1 GROUP BY user ;
DELETE FROM table_test WHERE isNeedGrouping = 1 ;
INSERT INTO table_test SELECT * FROM table_test_grouped ;
有什么简单的建议吗?
解决方法
清空并重新填充表格可能比尝试更新/删除更简单。另外,可以简化聚合逻辑,以避免使用用户变量。
您可以这样写:
create table table_test_tmp as
select min(id) id,sum(qty) qty,user,isneedgrouping
from table_test tt
group by tt.user,case when tt.isneedgrouping = 0 then tt.id end;
truncate table table_test; -- back it up first!
insert into table_test (id,qty,isneedgrouping)
select id,isneedgrouping
from table_test_tmp;
drop table table_test_tmp;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。