sql - 你能让这个查询更快吗?

标签 sql mysql

我目前正在做暑期工作,我必须扩展现有的计划。

我的老板要求我为我们的客户制作一个工具,以便他们可以了解员工每月的费用。但这还不是全部。问题是一家公司可以拥有一个或多个“社团”或子公司。我们想知道公司中每个员工的社会成本是多少。

这些是我使用的表格:

  • society:子公司,其 people_id 包含协会的名称等
  • 时间表:包含个人和社会信息的时间表条目
  • 人员:数据库中的所有人员或联系人
  • salarystate:包含某个人特定月份的工资
  • 开销:某个人在特定月份的开销(请注意,日期是一个字符串 (!),格式如下:YYYY-MM-DD)

此查询有效,但执行时间很长。有没有办法让它更快?

我选择年份和月份,获取雇员( worker )的姓名和社团的名称。然后我选择员工(针对特定社会)工作的分钟数总和。最后我通过查看他当月的工资和当月的管理费用来计算成本。

SELECT
    YEAR(TS.assigndate) AS timesheet_year,
    MONTH(TS.assigndate) AS timesheet_month,
    CONCAT(TP.name, ' ', TP.firstname) AS worker,
    CONCAT(SP.name, ' ', SP.firstname) AS society,
    (
        SELECT
            SUM(timeunits) AS minutes
        FROM timesheet
        WHERE
            people_id = TP.id AND
            society_id = S.id AND
            MONTH(assigndate) = timesheet_month
    ) AS minutes,
    (
        SELECT (minutes / 60)
    ) AS hours,
    (
        SELECT(OO.hourtarif + SS.hourtarif) AS cost
        FROM salarystate SS, overhead OO
        WHERE
            people_id = TP.id AND
            YEAR(OO.date) = timesheet_year AND
            MONTH(OO.date) = timesheet_month AND
            CONVERT(SUBSTRING(SS.month FROM 1 FOR 4), UNSIGNED) = timesheet_year AND
            CONVERT(SUBSTRING(SS.month, -2), UNSIGNED) = timesheet_month
    ) AS cost,
    (
        SELECT (hours * cost)
    ) AS total_cost
FROM timesheet TS, society S, people SP, people TP
WHERE
    S.id = TS.society_id AND
    SP.id = S.people_id AND
    TP.id = TS.people_id
GROUP BY timesheet_year, timesheet_month, worker, society; 

最佳答案

  1. 创建日期维度表 http://www.sqlserversavvy.com/2008/03/t-sql-script-to-create-date-dimension.html
  2. 将与日期列相关的列添加到此表
  3. 使用 dimDate 进行分组

关于sql - 你能让这个查询更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3633911/

相关文章:

sql - 如何在不使用 FETCH .. INTO 的情况下访问游标列

MySQL:传递给具有多列和行的PROCEDURE查询结果

sql - 使用 get_results() 执行时查询返回不同的结果

mysql - 将密码加密到 Spring3.1、Hibernate4 和 Jasypt1.90 的配置文件中不适用于 MySQL 服务器 5

php - 插入时出错

php - 即使未填写所有字段,表单也会提交

sql - 连接两个表时如何删除一个连接键

python - 如何在django中制作从10000开始的自动递增字段

php - MySQL:如果此 ip 没有任何记录,则插入

java - 在不影响速度的情况下在 MySQL 中检索大型结果集