使用mysql根据不同的坐位计算导师的工资

时间:2013-04-05 12:45:38

标签: mysql

我有下表,表示一个小组教学生的导师。每个学生都有一个进入数据库的条目。瞳孔可以单独或成组。我希望计算导师的“薪水”:支付是根据花费的时间 - 这意味着每次坐(有一个或多个学生)只会计算一次坐 - 不同的坐位!开始和结束时间是unix次。

<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

1 个答案:

答案 0 :(得分: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

我目前无法真正看到出席的情况,你没有说明。内部查询负责获取计划,提取开始日期和持续时间(以秒为单位)。

外部查询然后使用这些派生值,但将它们分组以获得总和。你可以从这里详细说明,也许你只想选择出勤率&gt; 0,或者你想增加出勤率。

在下一个示例中,我已经完成了这项工作,计算了以小时为单位的持续时间,并计算会话具有&gt; 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语句可以很容易地移动到子查询中。我只是把它们包括在内,这样你就能看到价值来自哪里。