8

我有下表表示一个导师在小组中教学生。每个学生都有一个进入数据库的条目。一个学生可以是一个人,也可以是一群人。我希望这样计算导师的“薪水”:付款是基于所花费的时间——这意味着每次坐(有一个或多个学生)只会计算一次坐——不同的坐!开始和结束时间是 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)) 作为年份,
    MONTHNAME(STR_TO_DATE(MONTH(FROM_UNIXTIME(start)), '%m')) 作为月份,
    COUNT(DISTINCT start) 作为坐席,
    SUM(TRUNCATE((end-start)/3600, 1)) 作为持续时间
    从时间表
    通过...分组
    年(FROM_UNIXTIME(开始)),
    月(FROM_UNIXTIME(开始))
    

感谢您的建议/支持!

编辑:所需的结果

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

1 回答 1

4

您可能可以对子查询做一些事情,我玩过 SQL fiddle,这对您来说如何。链接到 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 语句可以很容易地移到子查询中。我只是像这样将它们包括在内,这样您就可以看到值的来源。

于 2013-04-05T13:02:43.620 回答