业务:按照工时表求出上个月统计 需求如下
最终sql如下
SELECT
t.project_name AS 项目名称,
t.project_code AS 项目编号,
sum(hours) AS 工时,
count( user_count ) AS 总人数,
SUM(CASE WHEN t4.sex = '男' then 1 else 0 end) AS 男,
SUM(CASE WHEN t4.sex = '女' then 1 else 0 end) AS 女,
SUM(CASE WHEN t4.technical_title = 441 then 1 else 0 end) AS 高级,
SUM(CASE WHEN t4.technical_title = 440 then 1 else 0 end) AS 中级,
SUM(CASE WHEN t4.technical_title = 439 then 1 else 0 end) AS 初级,
SUM(CASE WHEN t4.technical_title = 442 then 1 else 0 end) AS 其他,
SUM(CASE WHEN t4.degree = 433 then 1 else 0 end) AS 博士,
SUM(CASE WHEN t4.degree = 432 then 1 else 0 end) AS 硕士,
SUM(CASE WHEN t4.degree = 431 then 1 else 0 end) AS 学士
FROM
(
SELECT
t2.project_name,
t2.project_code,
SUM( working_hours ) AS hours,
count( DISTINCT ( t1.user_oa_id ) ) AS user_count,
t1.user_oa_id
FROM
dw_cockpit_worktime t1
LEFT JOIN project_info t2 ON t1.project_code = t2.project_code
WHERE
t1.record_date >= '2021-09-01'
AND t1.record_date <= '2021-09-30'
GROUP BY
t1.project_code,
t1.user_oa_id
) t
LEFT JOIN project_info t2 ON t.project_code = t2.project_code
LEFT JOIN sys_user t3 ON t.user_oa_id = t3.user_id
LEFT JOIN project_team_members t4 ON t2.uuid = t4.project_info_uuid
AND t3.id = t4.user_id
AND t4.del = 0
GROUP BY
t.project_code
ORDER BY
t.project_code
由于之前按项目编号分组后钻牛角尖,项目成员表再关联的话sum性别这些总会出现计算重复数据的现象,后来不知道看的哪里才写出来这样,先计算按项目,成员分组的结果,再把结果集拿出来做连表查询做计算就简单多了,也才0.3秒多。
总结就是sql经验少,钻牛角尖了!