各位达人,先听小弟的问题描述:
项目中需要完成一个报表功能,所以我先在mssql中使用了查询分析器,完成大致的sql语句,其功能已经达到了要求,代码如下
select orgname, index_year, index_month,
sum(case when type='d'then 1 else 0 end), //当类型为‘d’是加1
sum(case when type='s' then 1 else 0 end), //当类型为‘s’是加1
sum(case when type='e' then 1 else 0 end), //当类型为‘e’是加1
sum(case when type='z' then 1 else 0 end), //当类型为‘z’是加1
sum(case when type!='s' then pprice else 0 end) from
(select sr.recid, datepart(year, sr.saledate) index_year,
datepart(month, sr.saledate) index_month,
u.cname, u.type, e.empname, o.orgname, p.pname, p.pprice
from t_sellrecord as sr, t_cuser as u, t_employment as e, t_organized as o, t_product as p
where datediff(month, sr.saledate ,getdate()) < 36
and o.recid = sr.saleorgid and sr.salesid = e.recid
and u.recid = sr.buyerid and p.recid = sr.proid )
x group by orgname, index_year, index_month order by orgname asc, index_year asc, index_month asc
然后直接考到java web项目中的dao中,使用hql语句,发现不支持datepart,所以改为直接sql,就使用了createSQLQuery,来进行查询,以上代码均未更改的直接copy了,查询结果另小弟十分疑惑。。。
sql查询分析器中是
eeee 2008 7 0 0 2 0 1000.0
aaaa 2008 7 0 2 0 0 0.0
bbbb 2008 7 0 0 2 0 1000.0
cccc 2008 7 0 1 0 0 0.0
dddd 2008 6 0 2 10 0 5000.0
dddd 2008 7 0 5 4 0 2000.0
而实际结果为
eeee 2008 7 0 0 0 0 0.0
aaaa 2008 7 0 0 0 0 0.0
bbbb 2008 7 0 0 0 0 0.0
cccc 2008 7 0 0 0 0 0.0
dddd 2008 6 0 0 0 0 0.0
dddd 2008 7 0 0 0 0 0.0
似乎,第一个sum中case when获取的结果把后面的值都覆盖了,
于是我试着吧type='d'改成1=1
sql查询分析器中是
eeee 2008 7 2 0 2 0 1000.0
aaaa 2008 7 2 2 0 0 0.0
bbbb 2008 7 2 0 2 0 1000.0
cccc 2008 7 1 1 0 0 0.0
dddd 2008 6 12 2 10 0 5000.0
dddd 2008 7 9 5 4 0 2000.0
而实际结果为
eeee 2008 7 2 2 2 2 2.0
aaaa 2008 7 2 2 2 2 2.0
bbbb 2008 7 2 2 2 2 2.0
cccc 2008 7 1 1 1 1 1.0
dddd 2008 6 12 12 12 12 12.0
dddd 2008 7 9 9 9 9 9.0
各位达人哇,我疑惑不解,疑惑不解,但求赐教~~跪谢
相关推荐
使用`CASE WHEN...THEN...ELSE...END`可以在查询中进行条件判断,生成动态结果。 综上所述,HQL提供了一系列强大的查询功能,涵盖了从简单的数据检索到复杂的条件过滤和聚合分析。掌握这些基础和进阶的知识点对于...
在Java开发领域中,Hibernate作为一款流行的开源对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式来处理数据库记录,从而避免了大量的SQL语句编写工作。随着Hibernate的不断更新和...
- Oracle的DECODE函数在DB2中不支持,可以使用CASE WHEN语句替代,如`SELECT CASE WHEN f_areaid IS NULL THEN '空' ELSE f_areaid END FROM masa_user`。 7. **NVL函数**: - Oracle的NVL在DB2中需要使用...
- **解释**: 在Java中,如果没有显式使用`break`语句,控制流将继续执行下一个`case`或`default`块,直到遇到`break`或到达`switch`语句的末尾。因此,这段代码将首先输出“default”,然后继续执行`case 0`块并输出...
使用批量插入时,可以在SQL语句中使用批处理的占位符,如`<insert id="batchInsert"><foreach item="item" index="index" collection="list" open="INSERT INTO table (" close=") VALUES (" separator="),">...`。...
- ORACLE 的 DECODE 函数在 DB2 中不受支持,但可以使用 CASE WHEN 语句来实现相同的功能。 8. **NVL 函数**: - NVL 在 ORACLE 中用于处理 NULL 值,DB2 中对应的函数是 COALESCE,它们都能将 NULL 替换为指定的...
在运行时,MyBatis会根据SQL和传入参数动态生成预编译的SQL语句,然后调用数据库API执行SQL并处理结果。 3. **MyBatis与Hibernate的区别?** MyBatis更注重SQL的自由度,而Hibernate提供了一种对象关系映射(ORM)...
- `<choose>`, `<when>`, `<otherwise>`:类似于Java中的switch-case语句。 - `<trim>`:用于修剪SQL语句中的前缀、后缀或者空白字符等。 - `<foreach>`:用于处理多个参数或者数组集合的循环操作。 #### 八、...
3. **时间倒序显示**:在MySQL中,如果需要时间字段为null的记录排在前面,并且按照时间倒序排列,可以使用`ORDER BY CASE WHEN ... END`,例如: ``` SELECT * FROM 表名 ORDER BY CASE WHEN IFNULL(字段名, '') ...
- ORACLE 的 DECODE 函数用于条件判断和返回值,DB2 不支持,但可以使用 CASE WHEN 语句替代。 8. **NVL 函数**: - ORACLE 的 NVL 用于处理 NULL 值,DB2 不支持 NVL,但可以使用 COALESCE 函数达到相同效果。 ...
- **作用**:MyBatis支持在XML映射文件中使用标签来构建动态SQL,实现逻辑判断和SQL拼接等功能。 - **动态SQL标签**: - `trim`:去除前缀或后缀文本,常用于去除多余的AND或OR等关键字。 - `where`:自动处理...
- **choose/when/otherwise**:类似SQL中的CASE WHEN语句,根据不同的条件选择执行不同的SQL片段。 ##### 3. 事务管理 - **基于JDBC的事务管理机制**:适用于简单的应用,可以使用try-catch-finally块来控制事务的...
- **choose/when/otherwise**:类似于 switch-case 语句,选择一个子句生成。 - **foreach**:用于循环遍历集合,生成重复的 SQL 子句。 - **where**:根据条件动态生成 WHERE 子句。 - **set**:动态生成 SET 子句...
- 在 try 语句块内使用 return 语句时,finally 块内的代码总是会被执行,不论 try 语句块内是否抛出了异常。 - 如果 try 语句块内没有抛出异常,则 finally 块会在 return 语句之前执行。 - 如果 try 语句块内抛出...
- **Choose-When-Otherwise**:类似于`CASE WHEN`结构,用于复杂的条件判断。 - **Foreach**:循环遍历集合或数组。 - **占位符**:`${}`和`#{}`分别表示字符串替换和预编译参数。 **关联关系** - **多对一**、**一...
- 在 SQL 语句中使用 IN 子句实现。 3. **动态设置表名**: - 通过变量或表达式动态指定表名。 4. **添加功能获取自增的主键**: - 使用 `useGeneratedKeys="true"` 和 `keyProperty` 属性。 #### 八、自定义映射 ...
- 统计x字段不同情况的个数,以及输出条数大于200的情况:`SELECT COUNT(DISTINCT x) AS distinct_count, SUM(CASE WHEN count(x) > 200 THEN 1 ELSE 0 END) AS more_than_200 FROM (SELECT x, COUNT(*) FROM A ...
6. **SQL统计查询**:使用CASE WHEN THEN语句结合GROUP BY和COUNT函数完成复杂的聚合统计。 7. **火车速度问题**:通过建立数学模型计算火车速度,考虑少年与火车的相对运动。 8. **Oracle语句与存储过程**:掌握DDL...
2. **choose/when/otherwise**:类似于Java中的switch-case结构。 3. **foreach**:遍历集合或数组,用于批量操作。 #### 八、案例实践:订单商品案例 1. **需求**:对订单商品案例中的用户表进行增删改查操作。 ...
3. **条件判断:** 熟练使用CASE when end else语句。 4. **函数使用:** 熟悉使用Decode函数、日期函数等。 5. **视图管理:** 熟悉创建和修改视图。 6. **索引管理:** 熟练创建和修改索引。 7. **统计分析:** 熟练...