Mysql

本文分享了一位工程师在处理上月项目工时统计时遇到的问题及解决方案。通过创建一个中间结果集避免了数据重复计算,显著提高了查询效率,从原本的复杂查询优化到仅用0.3秒。作者总结了SQL查询经验的重要性,提醒读者避免钻牛角尖。
摘要由CSDN通过智能技术生成

业务:按照工时表求出上个月统计 需求如下

 最终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经验少,钻牛角尖了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值