我有一个User模型和一个Workplace模型。 用户具有字段性别(m / f),每个工作场所都有许多用户。 我想选择工作场所中的用户总数,以及工作场所的女性用户总数,所有这些都按工作场所名称分组。
这是我尝试过的。
User.select("workplaces.name as workplace_name, count(*), count(case when users.gender='f' then 1 else 0 end) as females").joins("INNER JOIN workplaces on
workplaces.id=users.workplace_id").group(:workplace_name).map(&:attributes)
我使用条件选择女性用户数的第二个计数似乎不起作用。给出与第一次计数相同的结果。
查询有什么问题吗? 需要改变什么?
感谢您的回答。
更新
我用NULL替换0并且它有效。 现在我想得到男性和女性用户并进行计算 (女性 - 男性)/ 100,我如何在此查询中实现此目的。
由于
答案 0 :(得分:1)
表达式case when users.gender='f' then 1 else 0 end
永远不会返回NULL
,这意味着COUNT
会计算此表达式的所有实例,无论是1
还是0
。
将第二个COUNT
替换为SUM
。
答案 1 :(得分:0)
将第二个COUNT
替换为SUM
,如下所示
User.select("workplaces.name as workplace_name, COUNT(*),
SUM(case when users.gender='f' then 1 else 0 end) as females").
^^^ //Change here
joins("INNER JOIN workplaces on workplaces.id=users.workplace_id").
group(:workplace_name).map(&:attributes);