微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将多行转换为同一表格中的单行按合并分组方式减少

如何解决将多行转换为同一表格中的单行按合并分组方式减少

嘿,我想减少我的桌子并更新自己(对一些列进行分组和求和,并删除行)

源表“ 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 举报,一经查实,本站将立刻删除。