Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个联接按日期范围分组的MySQL_Mysql - Fatal编程技术网

使用多个联接按日期范围分组的MySQL

使用多个联接按日期范围分组的MySQL,mysql,Mysql,我目前有一个相当混乱的查询,它连接来自多个表的数据,涉及两个子查询。我现在需要按DAY()、WEEK()、MONTH()和QUARTER()对这些数据进行分组 我有三个表:days、qos和employees。employee是不言自明的,day是员工在给定日期的绩效总结,qos是随机质量检查,每天可以执行多次 目前,我正在选择所有员工,以及左加入ingday和qos,效果很好。但是,现在,我需要对数据进行分组,以便在一个日期范围内细分团队或个人的绩效 根据这些数据: 员工 id | name

我目前有一个相当混乱的查询,它连接来自多个表的数据,涉及两个子查询。我现在需要按
DAY()
WEEK()
MONTH()
QUARTER()对这些数据进行分组

我有三个表:
days
qos
employees
employee
是不言自明的,
day
是员工在给定日期的绩效总结,
qos
是随机质量检查,每天可以执行多次

目前,我正在选择所有
员工
,以及
左加入
ing
day
qos
,效果很好。但是,现在,我需要对数据进行分组,以便在一个日期范围内细分团队或个人的绩效

根据这些数据:

员工

id  | name
------------------
1   | Bob Smith

id  | employee_id  | day_date   | calls_taken
---------------------------------------------
1   | 1            | 2011-03-01 | 41
2   | 1            | 2011-03-02 | 24
3   | 1            | 2011-04-01 | 35
Qos

id   | employee_id  | qos_date   | score
----------------------------------------
1    | 1            | 2011-03-03 | 85
2    | 1            | 2011-03-03 | 95
3    | 1            | 2011-04-01 | 91
如果我从按
DAY()
分组开始,我需要看到以下结果:

Day__date  | Day__Employee__id | Day__calls | Day__qos_score
------------------------------------------------------------
2011-03-01 | 1                 | 41         | NULL
2011-03-02 | 1                 | 24         | NULL
2011-03-03 | 1                 | NULL       | 90
2011-04-01 | 1                 | 35         | 91
如您所见,
Day\uu calls
应该是
SUM(calls\u take)
Day\uu qos\u分数
AVG(score)
。我尝试过使用与上面类似的方法,但由于只有在其中一个表被连接后才知道日期,因此它只显示一条记录,其中保存了一天

有没有办法做到这一点,或者我是不是走错了路

编辑:根据要求,以下是我到目前为止的想法。但是,它只显示有
天的日期

SELECT COALESCE(`day`.day_date, qos.qos_date)      AS Day__date,
      employee.id                                  AS Day__Employee__id,
      `day`.calls_taken                            AS Day__Day__calls,
      qos.score                                    AS Day__Qos__score
FROM   faults_employees `employee`
      LEFT JOIN (SELECT `day`.employee_id                    AS employee_id,
                        SUM(`day`.calls_taken)               AS `calls_in`,
                 FROM   faults_days AS `day`
                 WHERE employee.id = 7
                 GROUP  BY (`day`.day_date)
        ) AS `day`
        ON `day`.employee_id = `employee`.id
      LEFT JOIN (SELECT `qos`.employee_id AS employee_id,
                        AVG(qos.score)   AS `score`
                 FROM   faults_qos qos
                 WHERE employee.id = 7
                 GROUP  BY (qos.qos_date)
        ) AS `qos`
        ON `qos`.employee_id = `employee`.id AND `qos`.qos_date = `day`.day_date
WHERE employee.id = 7
GROUP  BY Day__date
ORDER BY `day`.day_date ASC

我提出的解决方案如下所示:

SELECT
    `date`,
    `employee_id`,
    SUM(`union`.`calls_taken`) AS `calls_taken`,
    AVG(`union`.`score`) AS `score`
FROM ( -- select from union table
    (SELECT -- first select all calls taken, leaving qos_score null
        `day`.`day_date` AS `date`,
        `day`.`employee_id`,
        `day`.`calls_taken`,
        NULL AS `score`
    FROM `employee`
    LEFT JOIN
        `day`
            ON `day`.`employee_id` = `employee`.`id`
    )
    UNION -- union both tables
    (
    SELECT -- now select qos score, leaving calls taken null
        `qos`.`qos_date` AS `date`,
        `qos`.`employee_id`,
        NULL AS `calls_taken`,
        `qos`.`score`
    FROM `employee`
    LEFT JOIN
        `qos`
            ON `qos`.`employee_id` = `employee`.`id`
    )
) `union`
GROUP BY `union`.`date` -- group union table by date
为了使
UNION
起作用,我们必须将
day
表中的
qos\u分数
字段和
qos
表中的
calls\u take
字段设置为空。如果我们不这样做,
UNION
语句将把
calls\u taked
score
选择到同一列中。
在此之后,我从union'd表中选择了具有聚合函数
SUM()
AVG()
的必填字段,按union表中的
date
字段进行分组。

你能发布你的查询吗?@Christian我添加了与我即将发布的完全相同的当前查询+1解决方案,但你抢先了我!为了澄清为什么需要联合:感谢您澄清这是一个
完全外部连接
@mAu(和@Mike)+1谢谢各位好的先生们,你们已经省下了无数个小时来解决这个问题!