2011-07-23 17 views
3

私は現在、2つのサブクエリを含む複数のテーブルのデータを結合する非常に面倒なクエリを持っています。このデータをグループ化する必要があります(DAY()WEEK()MONTH()QUARTER())。複数の結合を持つ日付範囲によるMySQLのグループ化

私は3つのテーブル:days,qosおよびemployeesを持っています。 employeeは自明のものであり、dayは特定の日の従業員のパフォーマンスの要約であり、qosはランダム品質検査であり、1日に何度も実行できます。

瞬間、私はうまく機能しているすべてのemployees、およびLEFT JOINdayqosをINGのを、選択しています。しかし、今では、データをグループ化して、チームや個人のパフォーマンスをある期間にわたって分類する必要があります。このデータを取る

従業員

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

私は 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__callsSUM(calls_taken)Day__qos_scoreAVG(score)であるべきです。上記と同様の方法を試しましたが、テーブルの1つが結合されるまで日付がわからないため、dayが保存されているレコードのみが表示されます。

これを行う方法はありますか、それとも間違っているのでしょうか?

編集:要望どおり、これまでのところ私が思いついたことがあります。ただし、日付はdayの場合のみ表示されます。

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

質問を投稿できますか? –

+0

@Christian私は現在のクエリを追加しました –

答えて

2

私のようなルックスでアップ来てる解決策:UNIONについては

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 

たちはqos表にdayテーブル内qos_scoreフィールドとcalls_takenフィールドを設定する必要があり、作業しますnullにするそうでない場合はcalls_takenscoreの両方がUNIONステートメントで同じ列に選択されます。 この後、ユニオンテーブルのSUM()AVG()という集計ファンクションを持つ必須フィールドを、ユニオンテーブルのdateフィールドでグループ化して選択しました。

+2

+1私が掲載しようとしていたのとまったく同じ解決策でしたが、なぜUNIONが必要なのかを明確にする:[MySQLでFULL OUTER JOINをシミュレートする方法](http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in -mysql /) – Mike

+1

これは 'FULL OUTER JOIN'であることを明確にしてくれてありがとう! – mAu

+0

@mAu(そして@Mike)+1あなたに良いありがとう、ありがとうございました。 –

関連する問題