2017-10-21 105 views
1

我有以下兩個表格計算百分比使用活動記錄查詢

用戶

 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% 

使用下面的查詢,我能提取分子和百分比分別公式的分母,但不知道如何從這裏着手。如果有人能夠建議如何在單個查詢中提取所需的輸出,那將是最好的。

@active_user = Status.where(UserStatus: 「Active」).pluck(:UserID) 
@active_user_bycountry = User.group(:UserCountry).where(UserID: @user_active.to_a).count(:UserID) 
@total_user_bycountry = User.group(:UserCountry).count(:UserID) 

我已經徹底搜索過SO和Google,但還沒有找到任何合適的答案。答案是Difficulty with ActiveRecord query that does percentage calculation,但即使這樣也不適合我。

+0

你爲什麼有狀態的單獨的表? – Strawberry

+0

@Strawberry在完整的狀態表中,除了上面提到的之外,我們還有其他用戶狀態。例如。用戶ID 1是活動的也是默認的。但是,即使它在同一個表中,我的查詢的解決方案是什麼。 – AndEnthu

回答

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. 您需要joinsusersstatuses
  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按國家

希望這有助於。

更新

結果的例子:

+----+--------------+-------------+-------+------------+ 
| 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  | 
+----+--------------+-------------+-------+------------+ 
+0

在您的查詢中,百分比計算爲(一個國家/地區的總活躍用戶數)* 100 /(各國間活躍用戶總數),而我打算詢問(一個國家/地區的總活躍用戶數)* 100 /該國)。我試着在我的結尾即興查詢,但無法得到答案。請看看你是否可以再次刺傷它。 – AndEnthu