MariaDB/mysql SQL查询问题:我想根据另一列的组值对一列进行部分总和
Posted
技术标签:
【中文标题】MariaDB/mysql SQL查询问题:我想根据另一列的组值对一列进行部分总和【英文标题】:MariaDB/mysql SQL query question: I want a partial sum of a column based on the group values of another column 【发布时间】:2021-11-01 15:20:15 【问题描述】:我很难(而且很长)解释我需要什么,所以我会举个例子。 我有以下表结构:
CREATE TABLE example(
year CHAR(4) NOT NULL,
group CHAR(4) NOT NULL DEFAULT '',
subgroup CHAR(7) NOT NULL DEFAULT '',
items_1 INT(11),
set_item_1 INT(11),
items_2 INT(11),
set_item_2 INT(11),
PRIMARY KEY (year,group,subgroup)
);
以及下一个示例数据:
year | group | subgroup | items_1 | set_item_1 | items_2 | set_item_2 |
---|---|---|---|---|---|---|
2021 | G001 | G001-001 | 2 | 0 | 2 | 1 |
2021 | G001 | G001-002 | 5 | 1 | 2 | 1 |
2021 | G001 | G001-003 | 5 | 1 | 3 | 2 |
2021 | G001 | G001-004 | 5 | 1 | 3 | 2 |
2021 | G001 | G001-005 | 1 | 0 | 3 | 2 |
2021 | G002 | G002-001 | 3 | 2 | 4 | 3 |
2021 | G002 | G002-002 | 3 | 2 | 4 | 3 |
2021 | G003 | G003-001 | 7 | 0 | 1 | 0 |
2020 | G001 | G001-001 | 9 | 0 | 2 | 4 |
2020 | G001 | G001-002 | 5 | 0 | 2 | 4 |
2020 | G001 | G001-003 | 4 | 0 | 4 | 0 |
2020 | G002 | G002-001 | 8 | 3 | 1 | 0 |
2020 | G002 | G002-002 | 8 | 3 | 2 | 0 |
2020 | G002 | G002-003 | 8 | 3 | 3 | 0 |
我想实现一个视图(result_view),它为以前的数据返回这个结果:
SELECT * FROM result_view;
year | group | sum_items_1 | sum_items_2 |
---|---|---|---|
2021 | G001 | 8 | 5 |
2021 | G002 | 3 | 4 |
2021 | G003 | 7 | 1 |
2020 | G001 | 18 | 6 |
2020 | G002 | 8 | 6 |
set_item_1 = 0 means individual value of items_1 to sum
set_item_2 = 0 means individual value of items_2 to sum
set_item_1 > 0 means set n (all values of items_1 in the same n set are the same), we sum only one value of items_1 of set_item_1 = n
set_item_2 > 0 means set m (all values of items_2 in the same m set are the same), we sum only one value of items_2 of set_item_2 = m
所以result_view前面的sum_items_1和sum_items_2是根据下一个公式计算的:
year | group | sum_items_1 | sum_items_2 |
---|---|---|---|
2021 | G001 | 2 + 5 + 1 | 2 + 3 |
2021 | G002 | 3 | 4 |
2021 | G003 | 7 | 1 |
2020 | G001 | 9 + 5 + 4 | 2 + 4 |
2020 | G002 | 8 | 1 + 2 + 3 |
我不知道这样做的最佳方法是什么,我们将不胜感激。
我只能将问题拆分为两个查询(这将是混合的),一个用于计算 set_items_1 = 0 ,另一个用于 set_items_1 > 0 groups ,但我不知道这种方法是否有用。
SELECT year,group,
sum(items_1) AS sum_items_1
FROM example
WHERE set_item_1=0
group by year,group;
SELECT DISTINCT set_item_1, year, group,items_1 as sum_items_1
FROM example
WHERE set_item_1>0
group by DISTINCT set_item_1, year, group;
注意:在最后一个查询中,我们应该对同一年的每个 set_item_1 的所有 items_1 值求和,然后再分组。
【问题讨论】:
【参考方案1】:SELECT `year`, `group`,
SUM(DISTINCT CASE WHEN set_item_1 THEN items_1 ELSE 0 END)
+ SUM(CASE WHEN set_item_1 THEN 0 ELSE items_1 END) sum_items_1,
SUM(DISTINCT CASE WHEN set_item_2 THEN items_2 ELSE 0 END)
+ SUM(CASE WHEN set_item_2 THEN 0 ELSE items_2 END) sum_items_2
FROM example
GROUP BY `year`, `group`
ORDER BY `year` DESC, `group` ASC;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=015fb64321afe1dff716d9c3e2d21aaf
【讨论】:
以上是关于MariaDB/mysql SQL查询问题:我想根据另一列的组值对一列进行部分总和的主要内容,如果未能解决你的问题,请参考以下文章
如何在CSV导入(MariaDB / MySQL)上生成连锁主键?
binlog+审计日志 定位mariadb(mysql)数据库特定sql
如果查询中的日期时间有时区,MariaDB MySQL 查询要长得多,但如果没有添加时区,则非常快 - 为啥?