2011-06-18 13 views
1

私が必要とするのは、集約テーブルと特異テーブルのデータを報告できるSQLクエリです。私が持っている現在のデータベースは以下の通りです。一日のための単一の従業員の業績(とらコールの数、actionedチケットの数)Dayトラック内集計データを含む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, 
) 

行。 Qosは、1日の従業員の品質の尺度です(1日に複数のQosが存在する可能性があります。取得する必要があるのは平均スコアです)。また、Qosは従業員がデータベースに掲載されていない日に実行することもできますが、これは依然としてレポートに表示する必要があります。

必要な最終結果は4つのレポートで、従業員のパフォーマンスをさまざまな列でグループ化して示しています。 1日の単一従業員の業績、一定期間にわたる従業員の総実績、一定期間にわたるチームの業績、および一定期間にわたる部門全体の業績の内訳。

私の問題は、現在のクエリがちょっと複雑で、DayデータとQosデータの2つの個別のクエリが必要なことです。私の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テーブルに参加しようとしたが、それは複数行を返すため、それが台無しにまた、FULL OUTER JOIN機能がないために問題があります。

EDIT: 私はこれでいくつかの小さな進歩を遂げてきました。サブクエリを使用する方法がありますが、私がやっていることはすべて純粋な推測です。ここでは、私が今までに何を得ているのかは、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` 
+5

これは、「私のために仕事をしてくださいのウェブサイトではありません。これまでに何を持っていますか?データベーススキーマを投稿します。 – Halcyon

+0

もあいまいです。あなたが持っている問題/エラーを投稿してください。 – dynamic

+0

コメントを評価してください。私はすでに私がすでに持っているものを含めるために質問を編集しました。 –

答えて

1

あなたはfault_qosfault_daysサブクエリにleft join秒をしたいです。どちらか一方または両方に対応する行がない場合でも、結果が得られます。 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')を含めなければなりませんでしたが、これは絶対に完璧です!どうもありがとう –

関連する問題