Выбор положительных / отрицательных значений вычислительного SQL

#mysql #sql #postgresql #ruby-on-rails-4

#mysql #sql #postgresql #ruby-on-rails-4

Вопрос:

У меня есть модель пользователя и модель рабочего места. Пользователь имеет пол поля (m / f), и на каждом рабочем месте много пользователей. Я хочу выбрать количество общего числа пользователей на рабочем месте, а также количество общего числа женщин-пользователей на рабочем месте, сгруппированных по названию рабочего места.

Вот что я попробовал.

 User.select("workplaces.name as workplace_name, count(*) as FTE, (count(case when   users.gender='m' and users.created_at BETWEEN date_trunc('month', now()) and now() then 1   end)::float - count(case when users.gender='f' and users.created_at BETWEEN   date_trunc('month', now()) and now() then 1 else null end)::float)/100 as ratio").joins("INNER   JOIN workplaces on workplaces.id=users.workplace_id").group(:workplace_name).order("ratio    desc").limit(5).map(amp;:attributes)
  

Приведенный выше запрос получает пользователей мужского и женского пола на рабочем месте и вычисляет (женщины — мужчины) / 100 как таковой.
Я получаю соотношение как положительных, так и отрицательных значений.

Как мне выбрать только положительные значения / отрицательные значения вычисляемого коэффициента

Спасибо

Комментарии:

1. На данный момент я получаю как положительные, так и отрицательные значения из рассчитанного соотношения. Как выбрать только положительные значения отношения?

2. Как в ABS ?

3. HAVING ? postgresql.org/docs/current/static/sql-select.html#SQL-HAVING

4. может использоваться @pozs, имеющий. Но ratio не является полем / столбцом в таблице. Итак, как это использовать? наличие («отношение> 0») не работает

5. Не существует такого понятия, как отрицательное отношение . Также нет причин делить отношение на 100. Если вам нужно соотношение , это будет female/male . Если вам нужен процент , это female/totalEmployees . Что вы хотите? Это выглядит близко к процентной разнице, но и для этого не подходит.

Ответ №1:

Вы можете использовать HAVING предложение здесь, поскольку оно принимает любое выражение, а не только столбцы, например:

 HAVING (expr_for_ratio) > 0
  

SQLFiddle

Кроме того, вы могли бы использовать здесь подзапрос, но это было бы сложно записать в API rails.