使用以下结果集:
| 日期 | 业务 | 同事 | 职位 | 小时 | 标准时间 | 柜台 | 16岁以上 | 超过32 | 48岁以上 | -------------------------------------------------- -------------------------------------------------- ------------- | 2013-01-01 | 一个 | 鲍勃琼斯 | 分析师 | 168 | 168 | 1 | 0 | 0 | 0 | | 2013-01-01 | 一个 | 辛迪琼斯 | 助理 | 184 | 168 | 1 | 1 | 0 | 0 | | 2013-01-01 | 乙 | 蒂姆哈里斯 | 程序员 | 200 | 168 | 1 | 1 | 1 | 0 | | 2013-01-01 | 乙 | 汤姆·怀特 | 经理 | 216 | 168 | 1 | 1 | 1 | 1 | | 2013-02-01 | 一个 | 鲍勃琼斯 | 分析师 | 176 | 176 | 1 | 0 | 0 | 0 | | 2013-02-01 | 一个 | 辛迪琼斯 | 助理 | 176 | 176 | 1 | 0 | 0 | 0 | | 2013-02-01 | 乙 | 蒂姆哈里斯 | 程序员 | 200 | 176 | 1 | 1 | 0 | 0 | | 2013-02-01 | 乙 | 汤姆·怀特 | 经理 | 216 | 176 | 1 | 1 | 1 | 0 |
使用此查询:
SELECT c.date,
c.business,
CASE
WHEN Sum(c.over16) > 0 THEN ( Sum(c.over16) / Sum(c.counter) ) * 100
ELSE 0
END AS percOver16,
CASE
WHEN Sum(c.over32) > 0 THEN ( Sum(c.over32) / Sum(c.counter) ) * 100
ELSE 0
END AS percOver32,
CASE
WHEN Sum(c.over48) > 0 THEN ( Sum(c.over48) / Sum(c.counter) ) * 100
ELSE 0
END AS percOver48
FROM (SELECT a.date,
a.business,
a.colleague,
a.position,
a.hours,
b.standardhours,
1 AS counter,
CASE
WHEN a.hours >= b.standardhours + 16 THEN 1
ELSE 0
END AS over16,
CASE
WHEN a.hours >= b.standardhours + 32 THEN 1
ELSE 0
END AS over32,
CASE
WHEN a.hours >= b.standardhours + 48 THEN 1
ELSE 0
END AS over48
FROM colleaguetime a
JOIN businesshours b
ON b.date = a.date) c
GROUP BY c.date,
c.business
我得到:
| 日期 | 业务 | PERCOVER16 | PERCOVER32 | PERCOVER48 | -------------------------------------------------- -------------- | 2013-01-01 | 一个 | 0 | 0 | 0 | | 2013-01-01 | 乙 | 100 | 100 | 0 | | 2013-02-01 | 一个 | 0 | 0 | 0 | | 2013-02-01 | 乙 | 100 | 0 | 0 |
期望的结果是:
| 日期 | 业务 | PERCOVER16 | PERCOVER32 | PERCOVER48 | -------------------------------------------------- -------------- | 2013-01-01 | 一个 | 50 | 0 | 0 | | 2013-01-01 | 乙 | 100 | 100 | 50 | | 2013-02-01 | 一个 | 0 | 0 | 0 | | 2013-02-01 | 乙 | 100 | 50 | 0 |
有没有更简单的方法可以使用 CTE 做到这一点?