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

mysql查询数据库大小

如果查询中的日期时间有时区,MariaDB MySQL 查询要长得多,但如果没有添加时区,则非常快 - 为啥?

Centos7 之 MariaDB(Mysql) root密码忘记的解决办法

MariaDB/MySQL 中的 CREATE PROCEDURE 出现神秘错误