2013-04-05 37 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