使用活动记录查询计算百分比

时间:2017-10-21 05:55:14

标签: mysql ruby-on-rails ruby activerecord

我有以下两个表

用户

 UserID    UserName    UserCountry  
      1         User1       India  
      2         User2       India  
      3         User3       India  
      4         User4       China  
      5         User5       China  
      6         User6       Brazil  
      7         User7       Brazil  
      8         User8       USA  
      9         User9       USA  
     10         User10      USA  

状态

 UserID    UserStatus  
      1         Active  
      2         Active 
      3         Inactive 
      4         Inactive
      5         Dormant
      6         Dormant
      7         Active
      8         Inactive 
      9         Active
     10         Active  

我想查询这些表并计算按国家/地区排列的活跃用户的百分比。此示例中的输出应为

 Country    Percentage  
      India      66.66%  
      China      0.00% 
      Brazil     50.00%
      USA        66.66% 

使用下面的查询,我能够分别提取百分比公式的分子和分母,但不明白如何从这里开始。如果有人可以建议如何在单个查询中提取所需的输出,那将是最好的。

data-turbolinks="false"

我已经彻底搜索了SO和Google,但还没有找到任何合适的答案。一个接近的答案是Difficulty with ActiveRecord query that does percentage calculation,但即使这对我也不起作用。

1 个答案:

答案 0 :(得分:1)

试试这个:

User.joins(:status).select("users.country AS user_country", "statuses.status AS user_status", "COUNT(*) AS count", "ROUND((COUNT(*)*100.0/(SELECT COUNT(*) FROM statuses WHERE status = 'Active')), 2) AS percentage").where("user_status = 'Active'").group("user_country")

您可以克隆this project自行测试。

步骤:

  1. 您需要joins usersstatuses表格
  2. 接下来,您需要select列 - 在这种情况下,我们选择2列; country(来自users)和status(来自statuses
  3. 为了显示目的,我添加了另一个名为count的列,告诉我们每个国家/地区的活跃用户总数
  4. 接下来,我们将每个国家和地区的活跃用户总数增加100.0,并除以statuses表中的活跃用户总数
  5. 由于您只想要2个小数位,我们需要使用ROUND函数
  6. 我们在一个长语句中执行数字4和5,并将结果列名称别名为percentage
  7. 我们还需要告诉ActiveRecord我们只想要活跃用户 - 请查看where部分
  8. 最后,我们需要group按国家/地区
  9. 希望这有帮助。

    <强>更新

    结果示例:

    +----+--------------+-------------+-------+------------+
    | id | user_country | user_status | count | percentage |
    +----+--------------+-------------+-------+------------+
    |    | Brazil       | Active      | 7     | 20.59      |
    |    | China        | Active      | 9     | 26.47      |
    |    | India        | Active      | 11    | 32.35      |
    |    | USA          | Active      | 7     | 20.59      |
    +----+--------------+-------------+-------+------------+