Как не группировать столбец, если параметр столбца равен NULL в 'JPA Query'? - PullRequest
0 голосов
/ 06 августа 2020

Я хочу выбрать данные из таблицы и GROUP BY с city_id, District_id, ward_id. И если один из этих столбцов имеет значение null, тогда GROUP BY оставшиеся столбцы.

Пример: Если param: ward_id имеет значение null, тогда GROUP BY столбцы city_id, District_id. И столбец ward_id не влияет на GROUP BY. Спасибо.

Изменить: я добавляю сумму (людей) и фильтрую год в запросе.

@Query(value = "SELECT city_id, district_id, ward_id, sum(people) as sum_people
        FROM table  
        WHERE (:city_id is null OR city_id =:city_id ) 
        AND (:district_id is null OR district_id =:district_id ) 
        AND (:ward_id is null OR ward_id =:ward_id ) 
        AND year =:year
        GROUP BY city_id, district_id, ward_id",
        nativeQuery = true)
List<Object> findAddress(
        @Param("city_id") Integer city_id,
        @Param("district_id") Integer district_id,
        @Param("ward_id") Integer ward_id,
        @Param("year") Integer year
    )

1 Ответ

0 голосов
/ 06 августа 2020
SELECT * FROM table

Вы не выполняете агрегацию.

WHERE (:city_id is null OR city_id =:city_id ) 
AND (:district_id is null OR district_id =:district_id ) 
AND (:ward_id is null OR ward_id =:ward_id ) 

Вы также фильтруете данные на основе этих трех столбцов.

Итак, ответ - удалить группу полностью. Если вы хотите контролировать порядок вывода, используйте вместо этого ORDER BY.

После редактирования вы включили сумму (люди).

Попробуйте следующее - обратите внимание, что я не тестировал.

SELECT SELECT city_id, district_id, ward_id, sum(people) as sum_people
FROM (SELECT city_id, district_id, case :ward_id is null then '' else ward_id end ward_id, people
    FROM table
    WHERE (:city_id is null OR city_id =:city_id ) 
    AND (:district_id is null OR district_id =:district_id ) 
    AND (:ward_id is null OR ward_id =:ward_id )
) tmp
GROUP BY city_id, district_id, ward_id END

По сути, когда вы используете null для фильтрации ward_id, он заменит результаты на "", чтобы группа по суммировала все ward_id.

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