最近在做一个功能,产品期望做出如下一个报表出来,其中节点名称、超期完成数和完成总数分别对应数据库中一个字段,而超期比例则是需要通过 [超期完成数÷完成总数] 计算出来:
节点名称 | 超期完成数 | 完成总数 | 超期比例 |
发起者部门主管 | 2 | 4 | 50% |
发起人 | 1 | 5 | 20% |
- 第一步,我编写了如下SQL将前三列数据展现出来:
SELECT NODE_ACTIVITY_NAME AS '节点名称', FINISH_OVER_CASE_COUNT AS '超期完成数', FINISH_CASE_COUNT AS '完成数' FROM RPT_WF_ANALYSIS_NODE WHERE FINISH_OVER_CASE_COUNT > 0
MYSQL下结果,写起来还是很简单的嘛:
- 第二步,要计算超期比例,那么可以通过SQL来做,超期比例=超期完成数÷完成总数(黄底色代码):
SELECT NODE_ACTIVITY_NAME AS '节点名称', FINISH_OVER_CASE_COUNT AS '超期完成数', FINISH_CASE_COUNT AS '完成数', FINISH_OVER_CASE_COUNT/FINISH_CASE_COUNT AS '超期比例' FROM RPT_WF_ANALYSIS_NODE WHERE FINISH_OVER_CASE_COUNT > 0
MYSQL下结果是这样的:
本以为超期比例会是小数位0.xx,结果直接返回了整数0,显然计算结果是错误的!!!当时我的内心是崩溃的~~~
- 调试BUG:于是开始了漫长的分析,我通过调试工具发现'超期比例'通过Hibernate返回的是Long字段类型,估计某一步操作时将小数转换为整数了。反正产品要求我显示百分比,那么结果可以乘以100,于是我在Mysql下将超期比例SQL改为这样:
(FINISH_OVER_CASE_COUNT/FINISH_CASE_COUNT)*100 AS '超期比例'
MYSQL下结果终于正确了:
经过测试HQL/SQL都可以用这种方法。这个纠结的问题终于解决了,楼主我灰常高兴啊。看到同事的代码也有同样问题,还顺手协助他们修改了。
- 结果过了两天,测试同学报BUG了:在有超期完成数的情况下,超期比例还是0%。
连上数据库确实,妈蛋,SqlServer回显,什么情况~~~于是又继续苦逼地思考......
忽然看到BUG单上说,另一个页面类似功能就正常的,然后就找那块的开发勾兑了一下,发现人家的关键SQL是这样写的:
1.0*FINISH_OVER_CASE_COUNT/FINISH_CASE_COUNT
于是我又修改了我的SQL,终于正常了:
SELECT NODE_ACTIVITY_NAME AS '节点名称', FINISH_OVER_CASE_COUNT AS '超期完成数', FINISH_CASE_COUNT AS '完成数', 100 * FINISH_OVER_CASE_COUNT / FINISH_CASE_COUNT AS '超期比例' FROM RPT_WF_ANALYSIS_NODE WHERE FINISH_OVER_CASE_COUNT > 0
- 总结一下:
以上举例我用的是SQL,而实际开发过程中我用的HQL,两者都是一样的,所以均可做参考。
对于字段相除,我的感觉是:结果是跟第一个字段单位走的,如FINISH_OVER_CASE_COUNT是整数,则HQL返回的字段类型也是整数;如果该字段是带小数位的数字则返回结果应该就是小数了(参考1.0*FINISH_OVER_CASE_COUNT/FINISH_CASE_COUNT 的写法,该结果就是小数)。
相关推荐
之前写好SQL,再到代码里面来写,语句复杂的看的时不时细节会忘记,用sql转换hql工具,直接贴近了就可以了;
在IT领域,特别是数据库操作和查询语言中,HQL(Hibernate Query Language)与SQL(Structured Query Language)是两个重要的概念,它们各自拥有独特的特性和应用场景。本文将深入探讨HQL与SQL之间的区别,帮助读者...
标题中的“监控SQL输出-可以查看HQL转成SQL的结果值”指的是在使用HQL(Hibernate Query Language)进行数据库操作时,如何通过某些工具或手段来观察这些高级查询语句被转换成底层数据库能理解的SQL语句的过程,并对...
本文将深入探讨标题和描述中提到的“com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作”这一异常,以及如何在使用Hibernate、Struts进行分页时避免这一问题。我们将从异常的根本原因...
### HQL批量插入、更新和删除 #### 一、概述 在进行数据库操作时,批量处理数据是一项常见的需求。为了提高效率并减少网络传输开销,HQL(Hibernate Query Language)提供了一种灵活的方式来实现这一目标。HQL是...
Hive是Hadoop的一个组件,它提供了类似于SQL的查询语言(HQL),用于处理和分析存储在Hadoop集群中的大型数据集。 在使用此压缩包时,你需要将“sqljdbc4-4.jar”文件复制到Sqoop安装目录下的“lib”子目录。这样,...
在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL(Hibernate Query Language)。这两种查询方式各有优势,在不同的场景下使用可以达到最佳的效果。 ##### 一...
// 具有子查询的sql String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = ...
本主题将探讨如何在Hibernate分页类和JDBC的SQL分页方法之间实现完美的融合,以提高性能并提供更好的用户体验。 首先,让我们了解一下Hibernate的分页功能。Hibernate提供了一种方便的方式来处理分页查询,通过...
1. **语法规则**:HQL语法与SQL有许多相似之处,如查询、选择、排序等,但主要的区别在于HQL以类和属性为操作对象,而SQL以表和字段为主。例如,`from Employee as e`相当于SQL中的`select * from Employee`。 2. *...
与 SQL 相比,HQL 的查询方式和语法都有所不同。 首先,HQL 的查询目标是对象,而不是数据库表。因此,在 HQL 中,from 子句后面跟的是类名,而不是表名。例如:from Cat as cat,查询 Cat 对象的实例。 其次,HQL...
整理的HQL & SQL对比学习文档,程序员有用
hql开窗函数.sql
- **别名的正确使用**:在Hql中,当使用`count()`函数时,可以为表或字段定义别名,但在调用`count()`时,应直接使用列名或别名,而不是整个对象,如`count(*)`或`count(columnAlias)`,而不是`count(objectAlias.*...
本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...
HQL语句 HQL语句 HQL语句 HQL语句 HQL语句
在HQL中,你可以查询具有继承、多态和关联关系的数据。例如,如果你有一个继承层次结构的对象,HQL可以轻松处理这些继承关系。同样,对于多对一、一对多、多对多的关系,HQL也能提供简洁的查询语法。 【默认数据库...
本篇将深入探讨如何在Hibernate中调用配置文件中的SQL语句,以此提高代码的可维护性和灵活性。 首先,理解Hibernate的核心概念至关重要。Hibernate是一个对象关系映射(ORM)框架,它将Java对象与关系数据库中的...
与Hibernate的Session.delete()方法相比,通过JDBC API执行批量删除、更新和插入操作时,SQL语句中的数据不会被加载到内存中,从而不会占用额外的内存空间。 在Hibernate中,可以使用java.sql.Connection对象来创建...