group by 如何自定义规则分组,合并分组 朱雀 2022-06-03 02:09 284阅读 0赞 ## sql语句 group by时如何自定义规则进行分组 ## #### 1. 问题描述 #### 最近开发项目时遇到了一个需求:统计不同类型的物品的数量,但是某几种类型要合并到一起进行统计,例如:有A,B,C,D,E,F,G其中类型,但是统计时ACD合计为一种,FG合计为一种,假设表为: <table> <thead> <tr> <th align="center">type (类型)</th> <th align="center">num (数量)</th> </tr> </thead> <tbody> <tr> <td align="center">A</td> <td align="center">10</td> </tr> <tr> <td align="center">B</td> <td align="center">10</td> </tr> <tr> <td align="center">C</td> <td align="center">10</td> </tr> <tr> <td align="center">D</td> <td align="center">10</td> </tr> <tr> <td align="center">E</td> <td align="center">10</td> </tr> <tr> <td align="center">F</td> <td align="center">10</td> </tr> <tr> <td align="center">G</td> <td align="center">10</td> </tr> </tbody> </table> #### 2. 期望结果 #### 需要得到的结果为: <table> <thead> <tr> <th align="center">type (类型)</th> <th align="center">num (数量)</th> </tr> </thead> <tbody> <tr> <td align="center">ACD</td> <td align="center">30</td> </tr> <tr> <td align="center">B</td> <td align="center">10</td> </tr> <tr> <td align="center">E</td> <td align="center">10</td> </tr> <tr> <td align="center">FG</td> <td align="center">20</td> </tr> </tbody> </table> #### 3. 解决方案 #### > 解决方案肯定是多元化的,既可以在查询时进行处理,也可以在Java等高级语言拿到数据后进行处理,并且各自的处理方案会有多种,这里仅将本人采用的方案贴出。 因为博主认为在查询出数据后再对数据进行处理,不如在查询时就处理好方便,于是在查阅了众多资料之后终于找到了解决方案,采用 `case when then` 语句,针对上例,SQL 语句如下: SELECT CASE WHEN `type` IN('A','C','D') THEN 'ACD' WHEN `type` IN ('F', 'G') THEN 'FG' ELSE `type` END AS `types`, SUM(num) FROM demo GROUP BY `types` 等同于: SELECT CASE WHEN `type` IN('A','C','D') THEN 'ACD' WHEN `type` IN ('F', 'G') THEN 'FG' ELSE `type` END AS `types`, SUM(num) FROM demo GROUP BY CASE WHEN `type` IN('A','C','D') THEN 'ACD' WHEN `type` IN ('F', 'G') THEN 'FG' ELSE `type` END #### 4.后记 #### > 在遇到这个问题的时候我觉得开始觉得应该很麻烦,于是尝试性地上百度寻找答案,发现有些讲的是`GROUP_CONCAT` ,有些讲得很复杂(举写出来的SQL太繁杂),最后找到在快要放弃的时候 `case when` 这个关键字,再查找 `case when 与group by 用法` 的时候才渐渐有眉目,故以此记之,希望对大家有用,也留作自己备忘。 **附. 测试表SQL语句** /*Table structure for table `demo` */ DROP TABLE IF EXISTS `demo`; CREATE TABLE `demo` ( `type` varchar(10) DEFAULT NULL, `num` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `demo` */ insert into `demo`(`type`,`num`) values ('A',10),('B',10),('C',10),('D',10),('E',10),('F',10),('G',10);
还没有评论,来说两句吧...