使用mysql计算基于不同座位的导师工资 Rate = 25 Year Month Sittings Duration Bounty 2013 February 2 2.2 2.2*25 2013 April 4 12.0 12.0*25

使用mysql计算基于不同座位的导师工资 Rate = 25 Year Month Sittings Duration Bounty 2013 February 2 2.2 2.2*25 2013 April 4 12.0 12.0*25,mysql,Mysql,下表显示的是一名家庭教师以小组形式教授学生。每个学生都有一个数据库条目。学生可以是单独的,也可以是集体的。我希望计算导师的“工资”:工资是基于所花费的时间——这意味着每次坐(有一个或多个学生)只计算一次坐——不同的坐!开始和结束时间是unix时间 <pre> start end attendance 1359882000 1359882090 1 1359867600 1359867690 0 1359867600 1359867690 1 13598

下表显示的是一名家庭教师以小组形式教授学生。每个学生都有一个数据库条目。学生可以是单独的,也可以是集体的。我希望计算导师的“工资”:工资是基于所花费的时间——这意味着每次坐(有一个或多个学生)只计算一次坐——不同的坐!开始和结束时间是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>
Rate = 25
Year    Month   Sittings    Duration    Bounty
2013    February     2         2.2          2.2*25
2013    April        4         12.0         12.0*25

你也许可以用子查询做些什么,我已经玩过SQL fiddle,这对你来说怎么样。链接到sql fiddle:

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

外部查询然后使用这些派生值,但将它们分组以获得总和。您可以在此详细说明,即,您可能只想选择出勤率>0的位置,或者您想乘以出勤率

在下一个示例中,我已经这样做了,以小时为单位计算了持续时间,并计算了出席人数>1的会话的适用持续时间以及相应的奖金,假设奖金==小时*率:


这里的关键点是,在子查询中,每行执行所有计算。然后,主查询负责对结果进行分组并获取总数。例如,外部查询中的IF语句可以很容易地移动到子查询中。我只是像这样把它们包括进来,这样你就可以看到这些值是从哪里来的。

+1要发布你所尝试的内容,你还可以发布你想要的结果吗?@JW刚刚添加了想要的结果。持续时间基于不同坐姿的结束/开始)/3600(Hanks@Simon!我好像只有一个月!你的代码(特别是第二个代码)为我指明了正确的方向,但仍然缺少一些东西。你提供的示例都是在2013年2月。请参阅附件中3月份的带有时间戳的示例。这是否解决了您的问题,或者是否仍然存在与此相关的问题?我必须稍微调整您的解决方案,以提供所需的(完美的)解决方案!谢谢!事实上,我从你的解决方案中学到了很多!再次感谢!很高兴听到,根据提供的信息,我尽了最大努力,但很高兴听到你从中学到了一些东西:)
Rate = 25
Year    Month   Sittings    Duration    Bounty
2013    February     2         2.2          2.2*25
2013    April        4         12.0         12.0*25
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