我有以下模式:加入三個表(2級),並發現和基於條件 - SQL的Rails
User:
---
ID
---
Tasks:
-------------------
ID | classification
-------------------
Timesheets:
------------------------
ID | task_id | user_id
------------------------
TimesheetItem:
--------------------------------
ID | timesheet_id | hours | date
--------------------------------
協會:
class User
has_many :timesheets
end
class Task
has_many :timesheets
end
class Timesheet
has_many :timesheet_items
belongs_to :user
belongs_to :task
end
class TimesheetItem
belongs_to :timesheet
end
分類可以是 「收費」 或「非計費」。 現在我需要找到每個用戶的計費和非計費時間的這樣的總和:
-----------------------------------
|user_id | billable | nonbillable |
-----------------------------------
我在Rails有什麼:
User.joins(:timesheets, :timesheets => :task, :timesheets => :timesheet_items)
.select("SUM(CASE
WHEN tasks.task_classification = 'Billable'
THEN timesheet_items.hours
ELSE
0
END) as billable,
SUM(CASE
WHEN tasks.task_classification = 'Non-Billable'
THEN timesheet_items.hours
ELSE 0
END) as nonbillable")
但MySQL允許誤差「tasks.classification 「是一個未知的專欄。查看正在生成的查詢是可以理解的:
SELECT SUM(CASE WHEN tasks.classification = 'Billable' THEN hours ELSE 0 END) as billable, SUM(CASE WHEN tasks.classification = 'Non-Billable' THEN hours ELSE 0 END) as nonbillable FROM `users` INNER JOIN `timesheets` ON `timesheets`.`user_id` = `users`.`id` INNER JOIN `timesheet_items` ON `timesheet_items`.`timesheet_id` = `timesheets`.`id`
正如您所看到的任務表沒有被連接。
我該如何做到這一點?謝謝。
編輯:
我還挺與加入的任務表中得到的結果,因爲該數據僅用於在一個地方,很少一個普通的SQL查詢徑自。
但現在我需要按月分組,並查找每個用戶爲可計費和不計費小時記錄了多少小時。例如。
結果:
-----------------------------------------------
user_id | month | BillableHrs | NonBillableHRS|
-----------------------------------------------
我已經試過group(user_id, MONTH(date))
但..結果是怪異。我怎樣才能獲得這種信息?
而且BTW,改變加入到:
joins(:timesheets, :timesheets => [:task, :timesheet_items])
解決了柱沒有發現問題:)
伊夫終於到達了此解決方案。任何想法的優化?
SELECT
users.id as user_id,
users.name as user_name,
CONCAT(MONTHNAME(date)," ",YEAR(date)) as month,
SUM(CASE
WHEN tasks.task_classification = "Billable"
THEN hours
ELSE
0
END) as blb_sum,
SUM(CASE
WHEN tasks.task_classification = "Non-Billable"
THEN hours
ELSE
0
END) as nblb_sum
FROM `users`
INNER JOIN `timesheets` ON `timesheets`.`user_id` = `users`.`id`
INNER JOIN `timesheet_items` ON `timesheet_items`.`timesheet_id` = `timesheets`.`id`
INNER JOIN `tasks` ON `timesheets`.`task_id` = `tasks`.`id`
WHERE
timesheet_items.date >= '2013-11-1' AND
timesheet_items.date <= '2013-11-31'
這是ActiveRecord的和SQL的一個醜陋的組合 - 我只是運行它的SQL語句。 –
大聲笑。是啊,你說得對。我正在考慮這樣做。但是在AR中是否有任何方法來做案例?順便說一句,我用這個普通的SQL。 –
嗯,不,我知道的。我會提出另一個建議作爲答案,只是爲了看看人們對它的看法。 –