SQL查询:如何将单日最高6小时总工时平均分摊到员工当日多条销售数据行
工时计算需求实现方案
核心逻辑
先按「日期+员工」维度统计每个员工单日的销售记录行数,再用固定单日总工时6小时除以对应行数,即可得到单条记录分摊的工时。
代码实现
窗口函数实现(推荐,兼容主流SQL引擎:MySQL8.0+、PostgreSQL、Hive、Spark SQL等)
SELECT date, employee, products, sales, 6 / COUNT(*) OVER (PARTITION BY date, employee) AS hours FROM 你的业务表名;
逻辑说明:
COUNT(*) OVER (PARTITION BY date, employee)是窗口统计函数,不会改变原表的行数,会为每一行计算对应「相同日期+相同员工」分组下的总记录条数- 直接用固定总工时6除以该分组条数,即可得到每行分摊的工时值,完全匹配需求规则
子查询关联实现(兼容低版本不支持窗口函数的SQL引擎)
SELECT t1.date, t1.employee, t1.products, t1.sales, 6 / t2.daily_record_cnt AS hours FROM 你的业务表名 t1 LEFT JOIN ( -- 先统计每个员工每日的销售记录条数 SELECT date, employee, COUNT(*) AS daily_record_cnt FROM 你的业务表名 GROUP BY date, employee ) t2 ON t1.date = t2.date AND t1.employee = t2.employee;
结果验证
用你提供的测试数据执行上述代码,得到的结果和你给出的预期输出完全一致:
| date | employee | products | sales | hours |
|---|---|---|---|---|
| 20210101 | ben | 5 | laptop | 3 |
| 20210101 | ben | 10 | monitor | 3 |
| 20210201 | tim | 15 | laptop | 6 |
| 20210301 | tim | 10 | monitor | 6 |
内容的提问来源于stack exchange,提问作者tlqn
相关产品推荐
相关产品推荐

