Mysql按条件求和Sum函数
首先在写这博客的初衷是因为在工作开发过程中遇到了数据汇总问题,并且有的还是按条件汇总,这就有点小麻烦,然而学会使用sum函数之后,这些问题就迎刃而解了。是不是很Nice。好记性不如烂笔头!再此,希望能帮到类似需求的小伙伴,谢谢!!!下面进入正题。
一、汇总数据展示:
二、后台数据封装类:
public class FtDailyStaticData {private int moduleTotal;//模块总数private int modulePass;//模块通过的数量private int caseTocal;//用例总数private int casePassed;//用例通过数private int lineCover;//代码通过行数private int lineTotal;//代码总行数private int funcCover;//函数通过数private int funcTocal;//函数总数
}
//set、get方法省略
三、sql语句编写:
<select id="findSum" parameterType="java.lang.Integer" resultType="java.util.Map">SELECT COUNT(1) AS moduleTocal,SUM(IF(result='true',1,0)) AS modulePass,<!--SUM(CASE WHEN result = 'true' THEN 1 ELSE 0 END) AS passtotal,-->SUM(total) AS caseTocal,SUM(passed) AS casePass,SUM(line_total) ,SUM(line_cover),SUM(func_cover),SUM(func_total)FROM ft_build_info WHERE build_id = #{buildId}</select>
其中第三行和第四行的代码作用一样,只是两种不同的函数。这就是按条件汇总数据的函数:
SUM(IF(result='true',1,0)) AS modulePass,
SUM(CASE WHEN result = 'true' THEN 1 ELSE 0 END) AS passtotal,
注意:sum()是一个函数,在取值的时候要用map取值。这两个函数挺重要的,建议理解掌握
四、数据访问层
public interface FtBuildInfoDao {//这里用arrayList接受,是用来保证查询的数据是升序还是降序处理的//ArrayList<Map<String,Object>> findSum(Integer buildId);Map<String,Object> findSum(Integer buildId);
}
注意:用ArrayList接受Map做泛型的作用,如果没有要求对数据进行排序的要求,直接可以选择用Map进行接收!
五、业务层(取值):
public FtDailyStaticData findSum(Integer buildId) {//ArrayList<FtDailyStaticData> lists = new ArrayList<FtDailyStaticData>();//ArrayList<Map<String, Object>> list = ftTestDao.findSum(buildId);Map<String, Object> map = ftTestDao.findSum(buildId);FtDailyStaticData ftDailyStaticData = new FtDailyStaticData();//for (Map<String, Object> map : list) {Object object = map.get("moduleTocal");int moduleTocal = Integer.parseInt(object.toString());ftDailyStaticData.setModuleTotal(moduleTocal);//统计模块总数ftDailyStaticData.setModulePass(Integer.parseInt(map.get("modulePass").toString()));ftDailyStaticData.setCaseTocal(Integer.parseInt(map.get("caseTocal").toString()));ftDailyStaticData.setCasePassed(Integer.parseInt(map.get("casePass").toString()));ftDailyStaticData.setLineTotal(Integer.parseInt(map.get("SUM(line_total)").toString()));ftDailyStaticData.setLineCover(Integer.parseInt(map.get("SUM(line_cover)").toString()));ftDailyStaticData.setFuncTocal(Integer.parseInt(map.get("SUM(func_total)").toString()));ftDailyStaticData.setFuncCover(Integer.parseInt(map.get("SUM(func_cover)").toString()));//lists.add(ftDailyStaticData);//}return ftDailyStaticData;}
}
注意 :map取值的时候根据你sql查询的结果字段名进行取值,否则取不到相关的信息!!
六、控制层省略,直接调用业务层方法即可
七、测试:
成功返回,nb。
引申:
SELECT t.*, CONCAT (ROUND (IFNULL((t.Pass * 100 / t.Total), 0),2),'%') As Rate <!--求百分比并且保留两位小数--> from ( SELECT COALESCE( SUM(total),0 ) As Total, <!--这个意思是当total为null时返回0--> COALESCE( SUM(passed),0 ) AS Pass, COALESCE( SUM(error),0 ) AS Error FROM ft_build_info fb <where><if test="project != null and project.size !=0">and fb.ft_project_name in<foreach collection="project" item="item" open="(" separator="," close=")">#{item}</foreach></if><if test="version != null and version.size !=0">and fb.ft_version in<foreach collection="version" item="item" open="(" separator="," close=")">#{item}</foreach></if><if test="moduleName != null and moduleName.size !=0">and fb.module_name in<foreach collection="moduleName" item="item" open="(" separator="," close=")">#{item}</foreach></if><if test="type != null and type.length !=0">and fb.flag in<foreach collection="type" item="item" open="(" separator="," close=")">#{item}</foreach></if><if test="beginTime != null and beginTime != ''">and <![CDATA[fb.begin_time >= #{beginTime}]]></if><if test="endTime != null and endTime != ''">and <![CDATA[fb.end_time <= #{endTime}]]></if> </where> ) t
字符串日期格式的比较大小:
SELECT
*
FROM
ft_build_info fb
WHERE fb.begin_time >= CONCAT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 0 DAY),'%Y-%m-%d'), ' 00:00:00')
AND fb.end_time <= CONCAT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 0 DAY),'%Y-%m-%d'),' 23:59:59')其中DATE_ADD()函数是在该日期上加一个时间数,INTERVAL 后为正数就是加,为负数是减。
DATE_SUB()函数是在该日期上减去一个时间数,INTERVAL 后为负数就是加,为正数是减。
在做求和并且计算百分比的时候出现了一个问题,记录一下!!
修改之前的sql:
SELECT
t.* ,
CONCAT (ROUND (IFNULL((t.LineCover * 100 / t.LineTotal), 0.00),2),'%' ) As LineRate
FROM
(
SELECT
COALESCE( SUM(fb.line_total),0 ) As LineTotal,
COALESCE( SUM(fb.line_cover),0 ) AS LineCover,
CONCAT(fb.module_name,'') AS moduleName
FROM
ft_build_info fb
WHERE fb.flag = 1 GROUP BY fb.module_name
) t
WHERE 1=1 ORDER BY LineRate desc LIMIT 10
结果如下:
很奇怪,我明明是按照LineRate降序排列 的,为什么第一条数据排在第一条,很明显不对的。这是因为我们在使用concat函数时拼接了一个‘%’,这样在后续使用ORDER BY LineRate的时候,就会以字符串形式进行排序,怎么解决呢?
方法如下 :
方法一:ORDER BY '123'+0;(首推)
方法二:ORDER BY '123'*1;
方法三:ORDER BY CAST('123' AS SIGNED);
方法四:ORDER BY CONVERT('123',SIGNED);
注意:其中'123'是你要排序的字段。
演示第一种方法:
Mysql按条件求和Sum函数相关推荐
- Mysql - 带条件求和(sum)
有的时候我们带条件求某些合计字段,接下来我们一起了解下写法吧 已有表: 例:需要求 age 大于等于 20 的共计 多少 ? 可能有的童鞋,给出以下答案 select sum(age) from t ...
- SQL | DB2和MySQL分条件求和
为了探究对比DB2和MySQL多条件求和的区别,创建一个示例数据表: name acct date money a 1 20220430 15.0 a 2 20220430 30.0 a 1 2022 ...
- mysql的条件求和函数_mysql 带条件取count记录数,SUM()函数按条件求和
在做统计报表的时候,通常会用到一些复杂的统计功能,而不是简单的 count(*), sum(abc) 就可以的,这就用到了一些基于条件的统计功能. 带条件取count记录数 参考方法: 统计sub_t ...
- mysql的条件求和函数_使用SQL语句统计数据时sum和count函数中使用if判断条件的讲解...
首先举个栗子(不想看的话直接下面看总结): order_type:订单类型 open_id:用户唯一标识 SELECT date(create_time) AS '当天日期', sum(real_pr ...
- mysql sumif条件求和_sumif与sumifs条件求和函数详解,小白到大神的必经之路
在日常工作中我们经常需要根据某些条件进行求和,今天就给大家介绍下,Excel中的条件求和函数sumif和sumifs Sumif函数 第一个参数:Range:条件区域,用于条件判断的单元格区域.第二个 ...
- Excel多条件求和 SUMPRODUCT函数用法详解
http://ranran3299.blog.163.com/blog/static/38322561201191651023682/ 日常工作中,我们经常要用到多条件求和,方法有多种,第一类:使用基 ...
- Excel中3个超级好用的条件求和的函数
在EXCEL中我们经常会用到很多计算,而求和是使用频率最高的计算了,今天我们就讲解一下EXCEL中3个最好用的求和函数,SUM函数.SUMIF函数.SUMIFS函数,我们看下面几个案例. 1.求和函数 ...
- Excel多条件求和 SUMPRODUCT函数用法详解
日常工作中,我们经常要用到多条件求和,方法有多种,第一类:使用基本功能来实现.主要有:筛选.分类汇总.数据透视表.多条件求和向导:第二类:使用公式来实现方法.主要有:使用SUM函数编写的数组公式.联用 ...
- mysql sum_MySQL中的SUM函数使用教程
MySQL的SUM函数是用来找出记录中各种的字段的总和. 要了解SUM函数考虑EMPLOYEE_TBL表具有以下记录: mysql> SELECT * FROM employee_tbl; +- ...
最新文章
- 聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁
- 用scikit-learn进行LDA降维(转载+注释)
- PCB生成光绘文件教程 (Z)
- 信息学奥赛一本通(1012:计算多项式的值)
- 云计算之路-阿里云上:用上了开放缓存服务OCS
- VOIP术语及相关知识
- android genymotion模拟器怎么使用以及和google提供的模拟器性能对比
- 2017 Multi-University Training Contest - Team 3:1004. Kanade's trio(01字典树)
- 折腾一天,获取下列多选框的所有选中值,原生js可直接通过obj.val()来获取,可jq不行,要通过循环取值来获取;...
- 时间线故事脚本_时间轴的创意脚本
- 如何防止别人偷窥我给宝贝儿娜娜的信
- Switch语句:空指针异常
- Wireshark菜单栏介绍之编辑菜单4-4
- python天津儿童培训少儿编程课一定要了解
- JavaScript 实现web随机数排序、整除、重置
- JAVA中map集合
- 42道最新java开发常见面试题:JavaSE基础知识
- 你了解这么多万兆以太网规范吗?
- git:本地分支与远程分支
- android播放器:MediaPlayer ExoPlayer ijkplayer