2013-04-05 34 views
8

我有下表,表示一個教導小組學生的導師。每個學生都有一個進入數據庫的入口。學生可以是單獨的或在一個組中。我希望計算導師的「工資」,因爲支付是以花費的時間爲基礎的 - 這意味着每次坐着(與一個或多個學生一起)只計算一次坐位 - 不同的坐位!開始和結束時間是unix時間。使用mysql根據不同的坐位來計算導師的工資

<pre> 
    start end  attendance 
1359882000 1359882090 1 
1359867600 1359867690 0 
1359867600 1359867690 1 
1359867600 1359867690 0 
1360472400 1360477800 1 
1360472400 1360477800 1 
1359867600 1359867690 1 
1359914400 1359919800 1 
1360000800 1360006200 1 
1360000800 1360006200 0 
1360000800 1360006200 1 

</pre> 

這是我的嘗試:沒有成功 - 我不能得到正確的時間(小時數爲所有不同開庭)

 
    SELECT YEAR(FROM_UNIXTIME(start)) AS year, 
    MONTHNAME(STR_TO_DATE(MONTH(FROM_UNIXTIME(start)), '%m')) AS month, 
    COUNT(DISTINCT start) AS sittings, 
    SUM(TRUNCATE((end-start)/3600, 1)) as duration 
    FROM schedules 
    GROUP BY 
    YEAR(FROM_UNIXTIME(start)), 
    MONTH(FROM_UNIXTIME(start)) 

感謝您的建議/支持!

編輯:要求的結果

Rate = 25 
Year Month Sittings Duration Bounty 
2013 February  2   2.2   2.2*25 
2013 April  4   12.0   12.0*25 
+0

+1發佈你試過的東西 – 2013-04-05 12:47:24

+0

你也可以發佈你想要的結果嗎? – 2013-04-05 12:50:45

+1

@JW剛剛添加了所需的結果。持續時間基於結束開始)/ 3600不同坐位 – dorogz 2013-04-05 13:00:44

回答

4

你也許可以做一些子查詢,我已經受夠了SQL提琴戲,請問這是怎麼看你。鏈接到SQL小提琴:http://sqlfiddle.com/#!2/50718c/3

SELECT 
    YEAR(d.date) AS year, 
    MONTH(d.date) AS month, 
    COUNT(*) AS sittings, 
    SUM(d.duration) AS duration_mins 
FROM (
    SELECT 
    DATE(FROM_UNIXTIME(s.start)) AS date, 
    s.attendance, 
    end-start AS duration 
    FROM schedules s 
) d 

GROUP BY 
    year, 
    month 

我真的無法看到出勤進入這個目前沒有指定。內部查詢負責執行計劃,提取開始日期和持續時間(以秒爲單位)。

外部查詢然後使用這些派生值,但將它們分組以得到總和。你可以從這裏詳細說明,也許你只想選擇出席率> 0,或者你想乘坐考勤。

在接下來的例子我已經這樣做了,在計算時間的持續時間,而不是,並計算其中會話具有與適當的恩惠假設恩惠沿> 1個出勤適用持續時間==小時*率:http://sqlfiddle.com/#!2/50718c/21

SELECT 
    YEAR(d.date) AS year, 
    MONTH(d.date) AS month, 
    COUNT(*) AS sittings, 
    SUM(d.duration) AS duration, 
    SUM(
    IF(d.attendance>0,1,0) 
) AS sittingsWorthBounty, 
    SUM(
    IF(d.attendance>0,d.duration,0) 
) AS durationForBounty, 
    SUM(
    IF(d.attendance>0,d.bounty,0) 
) AS bounty 

FROM (
    SELECT 
    DATE(FROM_UNIXTIME(s.start)) AS date, 
    s.attendance, 
    (end-start)/3600 AS duration, 
    (end-start)/3600 * @rate AS bounty 
    FROM schedules s, 
    (SELECT @rate := 25) v 
) d 

GROUP BY 
    year, 
    month 

這裏的關鍵是,在子查詢中,你可以按行進行所有計算。主要查詢然後負責分組結果並獲得總計。例如,外部查詢中的IF語句可以很容易地移入子查詢中。我只是把它們包括在內,這樣你就可以看到價值從何而來。

+0

謝謝@Simon!我似乎只有一個月!你的代碼(特別是第二個)正在指引我朝着正確的方向發展,但還是有一些缺失。 – dorogz 2013-04-05 13:26:25

+0

您提供的示例全部都在2013年2月。請參閱附帶的示例,其中包含三月份的某些時間戳http://sqlfiddle.com/#!2/7feae/2 – 2013-04-05 13:33:39

+0

這是否解決了您的問題,還是仍有一些內容會給您與此有關的問題? – 2013-04-05 15:32:58