HQL с делом, сумма e max - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть запрос , который создает проблему, я думаю, что проблема возникает, потому что она не позволяет использовать функцию 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) ) ";

Ошибка стала возникать после того, как я изменил этот раздел, добавив caseвнутри sum:

"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) может быть последним платежом.У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 06 февраля 2019

Может быть, стоит также спросить, как реорганизовать этот запрос.Является ли производительность проблемой?Я имею в виду, вместо того чтобы выполнять один запрос, вы выполняете несколько меньших, если система будет работать очень медленно.

Напримерполучите MIN MAX(a.pre) в отдельном запросе, выполните SUM(CASE WHEN в коде Java и передайте эти значения в качестве параметров.

Если вы решите выполнить рефакторинг, было бы безопасно сначала добавить несколько тестов, чтобы увидеть поведениестарый запрос с определенными значениями.Затем выполните рефакторинг.И, наконец, повторите тесты, которые вы добавили, чтобы убедиться, что вы не добавили ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...