我的查询在sqldeveloper中有效,但在jpql中没有(eclipselink 2.6)。
select trunc(SYS_CR_DT, 'mm'), count(trunc(SYS_CR_DT, 'mm')) from A
group by trunc(SYS_CR_DT, 'mm')
order by trunc(SYS_CR_DT, 'mm') DESC;
这适用于sqldeveloper,但这不是(在jpql中),说它不是按表达式分组:
"SELECT FUNCTION('TRUNC', lh.sysCreateDate, 'mm'), COUNT(FUNCTION('TRUNC', lh.sysCreateDate, 'mm')) "
+ " FROM A lh"
+ " GROUP BY FUNCTION('TRUNC', lh.sysCreateDate, 'mm')"
+ " ORDER BY FUNCTION('TRUNC', lh.sysCreateDate, 'mm') DESC";
这也有效,因此使用该功能进行分组是有效的:
"SELECT FUNCTION('TRUNC', lh.sysCreateDate), COUNT(FUNCTION('TRUNC', lh.sysCreateDate)) "
+ " FROM A lh"
+ " GROUP BY FUNCTION('TRUNC', lh.sysCreateDate)"
+ " ORDER BY FUNCTION('TRUNC', lh.sysCreateDate) DESC";
这也有效,所以它不是第二个参数的问题,而是分组:
"SELECT FUNCTION('TRUNC', lh.sysCreateDate, 'mm'), COUNT(FUNCTION('TRUNC', lh.sysCreateDate, 'mm')) "
+ " FROM A lh"
长话短说:当我添加第二个参数时,它仍然是一个有效的函数调用,但不能在group by中工作。
任何想法都将受到赞赏。
答案 0 :(得分:0)
在您的SQL Developer查询中,您按trunc(SYS_CR_DT, 'mm')
进行分组,而jpql
查询按month
进行分组。所以,真的,那些不是同一个查询,比较它们是不公平的。
问题是,在Oracle中,select
子句中定义的别名(即:month
)不能在group by
子句中引用。原因很简单:group by
子句在 select
子句之前被处理。 (在order by
子句中使用别名是可以的,因为order by
子句最后被处理了)
我不是jpql
专家,但我猜您应该做以下事情:
"SELECT FUNCTION('TRUNC', lh.sysCreateDate, 'mm') AS month, COUNT(FUNCTION('TRUNC', lh.sysCreateDate, 'mm')) "
+ " FROM A lh"
+ " GROUP BY FUNCTION('TRUNC', lh.sysCreateDate, 'mm')"
+ " ORDER BY month DESC";
答案 1 :(得分:0)
所以我无法解决问题,对我来说似乎是个错误。 无论如何,我做到了。不是一个好的解决方案,但我能做些什么。
CREATE OR REPLACE FUNCTION TRUNCBYMONTH(
dateparam DATE
)
RETURN DATE
AS
BEGIN
RETURN TRUNC(dateparam, 'mm');
END;
使用'mm'额外参数调用此函数而不是原始TRUNC可正常工作。