2013-08-12 1 views
2

Я хочу рассчитать процент людей, которые не активны, делятся на процент активных людей.Как я могу разделить два результата подсчета HQL?

я сделаю что-то вроде следующего запроса HQL, но он не работает:

(select count(x) from People as x where x.active=false)/
(select count(x) from People as x where x.active=true) 

Как я могу это сделать?

+0

Что не работает? Если вы получаете NPE, это может быть из [этой ошибки] (https://hibernate.atlassian.net/browse/HHH-2917) – doelleri

ответ

1

Вы можете использовать предложение group by, чтобы выразить это. Вот как вы можете сделать это в Grails:

def countByAction = People. 
    executeQuery("select active, count(*) from People group by active")*. 
    toList(). 
    collectEntries{it} 
println (countByAction[true]) 
println (countByAction[false]) 
+0

Hi ataylor, я не понимаю этого ... делает ли это то, что пользователь запросил? можете ли вы добавить описание того, как это работает? –

+0

Он использует предложение HQL group by, чтобы разделить результаты запроса на группы. В частности, он группируется столбцом «active». Поскольку 'active' является логическим полем, он разбивает результаты на две группы для true и false. 'Count (*)' выбирает количество записей в каждой группе. Результаты запроса будут похожи на '[[true, 10], [false, 20]]'. Это может быть полезно для понимания группировки в HQL/SQL: http://stackoverflow.com/questions/7434657/ – ataylor

0

Что-то, как это должно работать

String hql = "select count(x)/(select count(x) from People as x where x.active=true) 
       from People as x where x.active=false"; 

Long result = (Long) em.createQuery(hql).getSingleResult(); 

Примечание: выше непроверенных