我有下表,表示一个小组教学生的导师。每个学生都有一个进入数据库的条目。瞳孔可以单独或成组。我希望计算导师的“薪水”:支付是根据花费的时间 - 这意味着每次坐(有一个或多个学生)只会计算一次坐 - 不同的坐位!开始和结束时间是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
答案 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语句可以很容易地移动到子查询中。我只是把它们包括在内,这样你就能看到价值来自哪里。