2011-06-18 45 views
1

我需要的是一個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功能也存在問題。

編輯: 我做了這個有些進展。它看起來像使用子查詢是要走的路,但我所做的一切都是純粹的猜測。這是迄今爲止我所得到的結果,如果DayQos表中有一個條目,它只顯示一行,這不是我想要的,我也不知道如何擴展它以包含上述各種分組。

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` 
+5

這不是一個「請做我的工作,我的網站。到目前爲止,你有什麼?併發布您的數據庫架構。 – Halcyon

+0

太慷慨了。發佈您遇到的問題/錯誤 – dynamic

+0

欣賞評論。我現在編輯了這個問題,包括我已經得到的。 –

回答

1

你想在fault_qosfault_days子查詢left join秒。即使在一個或兩個中沒有相應的行,這也會給你一個結果。 A left join表示該值在連接中左側的表中是必需的,但在右側沒有。我沒有測試過這一點,它的晚,所以我可能不能清楚地思考,但如果你改變你的查詢到這一點,應該工作:

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` 
LEFT 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` 
LEFT 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` 
+0

爲了滿足其他分組需求,我不得不在其中的兩個子查詢中加入其他連接('Team'和'Department'),但除此之外,這絕對是完美的!非常感謝 –