HQL with case, sum e max
HQL with case, sum e max
我有一个 query 有问题,我相信问题的发生是因为它不允许使用 max
函数,在 max
函数,我说的对吗?
我该如何解决这个问题?我需要添加除最后一个 row
.
之外的所有值
查询:
"SELECT new project.domain.vo.MediaPagVo(" +
"a.nomeUsuario, " +
"a.cpfUsuario, " +
"a.cnpjUnidadeUsuario, " +
"a.nomeUnidadeUsuario, " +
"a.codigoGrupoUsuario, " +
"a.grupo.id AS idGrupo, " +
"CASE " +
"WHEN MAX(a.pre) - MIN(a.pre) > 0 " +
"THEN ((MAX(a.pre) - MIN(a.pre)) / SUM(CASE WHEN max(a.dtRequisicao) > a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"ELSE ((MAX(a.pos) - MIN(a.pos)) / SUM(CASE WHEN max(a.dtRequisicao) >= a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"END AS mediaConsumo, " +
"CASE " +
"WHEN MAX(a.pre) - MIN(a.pre) > 0 " +
"THEN " + Tipo.PRE.getValue() + " " +
"ELSE " + Tipo.POS.getValue() + " " +
"END AS tipoPag) " +
"FROM " +
" Pagamento a " +
"WHERE " +
"a.status = " + StatusPagamento.Concluido.getValue() + " AND " +
"a.dataRequisicao BETWEEN :inicio and :fim AND " +
"( :idGrupo IS NULL OR a.grupo.id = :idGrupo) " +
"GROUP BY " +
" a.nomeUsuario, a.cpfUsuario, a.cnpjUnidadeUsuario, a.nomeUnidadeUsuario, a.codigoGrupoUsuario, a.grupo.id, " +
"HAVING (MAX(a.pos) - MIN(a.pos) > 0 OR MAX(a.pre) - MIN(a.pre) > 0) AND " +
"( :tipoConsumo IS NULL OR " +
":tipoConsumo = " + Tipo.PRE.getValue() + " AND " +
"(MAX(a.pre) - MIN(a.pre) > 0) " +
"OR :tipoConsumo = " + Tipo.POS.getValue() + " AND " +
"(MAX(a.pos) - MIN(a.pos) > 0) ) ";
我修改了这一段,在sum
:
里面加了case
之后就开始报错了
"CASE WHEN MAX(a.pre) - MIN(a.pre) > 0 " +
"THEN ((MAX(a.pre) - MIN(a.pre)) / SUM(CASE WHEN max(a.dtRequisicao) > a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"ELSE ((MAX(a.pos) - MIN(a.pos)) / SUM(CASE WHEN max(a.dtRequisicao) >= a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"END AS mediaPag, "
java返回的错误:
Could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
ORA-00937: not a single-group group function tips
我的目标是将那段时间的所有付款加起来,减去最后一笔。不幸的是,我不能只移动过滤器,因为 max (a.pre), max (a.pos)
可能是最后一笔付款。有人有什么想法吗?
也许还值得一问如何重构此查询。性能有问题吗?我的意思是,不是 运行 宁一个查询,而是 运行 几个较小的查询,系统会很慢。
例如。在单独的查询中获取 MIN MAX(a.pre)
,在 Java 代码中执行 SUM(CASE WHEN
并将这些值作为参数传递。
如果您决定重构,首先添加一些测试以查看具有特定值的旧查询的行为是安全的。然后进行重构。最后,重新运行 您添加的测试以检查您没有添加任何错误。
我有一个 query 有问题,我相信问题的发生是因为它不允许使用 max
函数,在 max
函数,我说的对吗?
我该如何解决这个问题?我需要添加除最后一个 row
.
查询:
"SELECT new project.domain.vo.MediaPagVo(" +
"a.nomeUsuario, " +
"a.cpfUsuario, " +
"a.cnpjUnidadeUsuario, " +
"a.nomeUnidadeUsuario, " +
"a.codigoGrupoUsuario, " +
"a.grupo.id AS idGrupo, " +
"CASE " +
"WHEN MAX(a.pre) - MIN(a.pre) > 0 " +
"THEN ((MAX(a.pre) - MIN(a.pre)) / SUM(CASE WHEN max(a.dtRequisicao) > a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"ELSE ((MAX(a.pos) - MIN(a.pos)) / SUM(CASE WHEN max(a.dtRequisicao) >= a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"END AS mediaConsumo, " +
"CASE " +
"WHEN MAX(a.pre) - MIN(a.pre) > 0 " +
"THEN " + Tipo.PRE.getValue() + " " +
"ELSE " + Tipo.POS.getValue() + " " +
"END AS tipoPag) " +
"FROM " +
" Pagamento a " +
"WHERE " +
"a.status = " + StatusPagamento.Concluido.getValue() + " AND " +
"a.dataRequisicao BETWEEN :inicio and :fim AND " +
"( :idGrupo IS NULL OR a.grupo.id = :idGrupo) " +
"GROUP BY " +
" a.nomeUsuario, a.cpfUsuario, a.cnpjUnidadeUsuario, a.nomeUnidadeUsuario, a.codigoGrupoUsuario, a.grupo.id, " +
"HAVING (MAX(a.pos) - MIN(a.pos) > 0 OR MAX(a.pre) - MIN(a.pre) > 0) AND " +
"( :tipoConsumo IS NULL OR " +
":tipoConsumo = " + Tipo.PRE.getValue() + " AND " +
"(MAX(a.pre) - MIN(a.pre) > 0) " +
"OR :tipoConsumo = " + Tipo.POS.getValue() + " AND " +
"(MAX(a.pos) - MIN(a.pos) > 0) ) ";
我修改了这一段,在sum
:
case
之后就开始报错了
"CASE WHEN MAX(a.pre) - MIN(a.pre) > 0 " +
"THEN ((MAX(a.pre) - MIN(a.pre)) / SUM(CASE WHEN max(a.dtRequisicao) > a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"ELSE ((MAX(a.pos) - MIN(a.pos)) / SUM(CASE WHEN max(a.dtRequisicao) >= a.dtRequisicao THEN a.valorTotal ELSE 0 END)) " +
"END AS mediaPag, "
java返回的错误:
Could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
ORA-00937: not a single-group group function tips
我的目标是将那段时间的所有付款加起来,减去最后一笔。不幸的是,我不能只移动过滤器,因为 max (a.pre), max (a.pos)
可能是最后一笔付款。有人有什么想法吗?
也许还值得一问如何重构此查询。性能有问题吗?我的意思是,不是 运行 宁一个查询,而是 运行 几个较小的查询,系统会很慢。
例如。在单独的查询中获取 MIN MAX(a.pre)
,在 Java 代码中执行 SUM(CASE WHEN
并将这些值作为参数传递。
如果您决定重构,首先添加一些测试以查看具有特定值的旧查询的行为是安全的。然后进行重构。最后,重新运行 您添加的测试以检查您没有添加任何错误。