使用多个联接按日期范围分组的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
是随机质量检查,每天可以执行多次
目前,我正在选择所有员工
,以及左加入
ingday
和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谢谢各位好的先生们,你们已经省下了无数个小时来解决这个问题!