我需要的是一個SQL查詢,它可以彙總來自聚合和單數表的數據。我擁有的當前數據庫如下。MySQL加入涉及彙總數據
CREATE TABLE IF NOT EXISTS `faults_days` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`employee_id` int(11) NOT NULL,
`day_date` date NOT NULL,
`actioned_calls_out` int(11) NOT NULL,
`actioned_calls_in` int(11) NOT NULL,
`actioned_tickets` int(11) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_departments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`team_id` int(11) NOT NULL,
`name` varchar(127) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_qos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`qos_date` datetime NOT NULL,
`employee_id` int(11) NOT NULL,
`score` double NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_teams` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`department_id` int(11) NOT NULL,
`name` varchar(40) NOT NULL,
)
一排Day
跟蹤單個員工的單日(採取電話,付諸行動的門票數)的性能。 Qos是衡量每天員工素質的指標(每天可以有多個Qos - 我需要獲得的是平均分數)。另外,Qos可以在員工在數據庫中沒有績效記錄的日子執行,並且仍然需要在報告中顯示。
需要的最終結果是4個報告,顯示按不同列分組的員工績效。一天中單個員工的表現分析,一段時間內員工的總體表現,一段時間內一個團隊的表現以及一段時間內整個部門的表現。
我的問題是,我目前的查詢有點複雜,需要兩個單獨的查詢Day
數據和Qos
數據。在輸出報告之前,我的PHP應用程序會合並數據。 我想要的是一個返回總體性能和平均質量分數的單個查詢。
目前的查詢我必須表明員工表現爲:
SELECT
`Employee`.`name` ,
`Team`.`name` ,
`Department`.`name` ,
SUM( `Day`.`actioned_calls_in`) + SUM( `Day`.`actioned_calls_out`) ,
SUM( `Day`.`actioned_tickets`)
FROM
`faults_days` AS `Day`
JOIN
`faults_employees` AS `Employee` ON `Day`.`employee_id` = `Employee`.`id`
JOIN
`faults_teams` AS `Team` ON `Employee`.`team_id` = `Team`.`id`
JOIN
`faults_departments` AS `Department` ON `Team`.`department_id` = `Department`.`id`
WHERE
`Day`.`day_date` >= '2011-06-01'
AND `Day`.`day_date` <= '2011-06-07'
GROUP BY `Employee`.`id`
WITH ROLLUP
和
SELECT
`Employee`.`name` ,
`Team`.`name` ,
`Department`.`name` ,
COUNT( `Qos`.`score`) ,
AVG( `Qos`.`score`)
FROM
`faults_qos` AS `Qos`
JOIN
`faults_employees` AS `Employee` ON `Qos`.`employee_id` = `Employee`.`id`
JOIN
`faults_teams` AS `Team` ON `Employee`.`team_id` = `Team`.`id`
JOIN
`faults_departments` AS `Department` ON `Team`.`department_id` = `Department`.`id`
WHERE
`Qos`.`qos_date` >= '2011-06-01'
AND `Qos`.`qos_date` <= '2011-06-07'
GROUP BY `Employee`.`id`
WITH ROLLUP
我也試圖簡單地加入QoS表,而是因爲它返回多行它攪亂了總計爲SUM()
,並且由於缺少FULL OUTER JOIN
功能也存在問題。
編輯: 我做了這個有些小進展。它看起來像使用子查詢是要走的路,但我所做的一切都是純粹的猜測。這是迄今爲止我所得到的結果,如果Day
和Qos
表中有一個條目,它只顯示一行,這不是我想要的,我也不知道如何擴展它以包含上述各種分組。
SELECT
`Employee`.`name` ,
`Team`.`name` ,
`Department`.`name`,
`Day`.`Calls`,
`Day`.`Tickets`,
`Qos`.`NumQos`,
`Qos`.`Score`
FROM `faults_employees` AS `Employee`
JOIN
`faults_teams` AS `Team` ON `Employee`.`team_id` = `Team`.`id`
JOIN
`faults_departments` AS `Department` ON `Team`.`department_id` = `Department`.`id`
JOIN
(SELECT
`Day`.`employee_id` AS `eid`,
SUM(`Day`.`actioned_calls_in`) + SUM(`Day`.`actioned_calls_out`) AS `Calls`,
SUM(`Day`.`actioned_tickets`) AS `Tickets`
FROM `faults_days` AS `Day`
WHERE
`Day`.`day_date` = '2011-03-02'
GROUP BY `Day`.`employee_id`
) AS `Day`
ON `Day`.`eid` = `Employee`.`id`
JOIN
(SELECT
`Qos`.`employee_id` AS qid,
COUNT(`Qos`.`id`) AS `NumQos`,
AVG(`Qos`.`score`) AS `Score`
FROM `faults_qos` AS `Qos`
WHERE
`Qos`.`qos_date` = '2011-03-02'
GROUP BY `Qos`.`employee_id`
) AS `Qos`
ON `Qos`.`qid` = `Employee`.`id`
GROUP BY `Employee`.`id`
這不是一個「請做我的工作,我的網站。到目前爲止,你有什麼?併發布您的數據庫架構。 – Halcyon
太慷慨了。發佈您遇到的問題/錯誤 – dynamic
欣賞評論。我現在編輯了這個問題,包括我已經得到的。 –