2017-06-12 8 views
1

私は、MySQL 5.7を使用してデータを集計したい4つのテーブルを持っています。別のテーブルの複数の列にSUMを追加する方法はありますか?

Projects 
+------------+--------+------------------+ 
| project_id | org_id |  name  | 
+------------+--------+------------------+ 
|   1 |  1 | Big Project  | 
|   2 |  1 | Internal Project | 
+------------+--------+------------------+ 

Tasks 
+-----------+--------+----------------+------------+ 
| task_id | org_id |  name  | project_id | 
+-----------+--------+----------------+------------+ 
|   1 |  1 | Check Work  |   1 | 
|   2 |  1 | Fix Code  |   1 | 
|   3 |  1 | Rebuild Office |   2 | 
+-----------+--------+----------------+------------+ 

Resources 
+-------------+--------+-------------+-----------+ 
| resource_id | org_id | first_name | last_name | 
+-------------+--------+-------------+-----------+ 
|   1 |  1 | Alice  | Black  | 
|   2 |  1 | Bob   | Smith  | 
|   3 |  1 | Charlie  | White  | 
+-------------+--------+-------------+-----------+ 

Task_Details 
+-------------+--------+---------+-------------+ 
| resource_id | org_id | task_id | total_hours | 
+-------------+--------+---------+-------------+ 
|   1 |  1 |  1 |   12 | 
|   2 |  1 |  1 |   4 | 
|   3 |  1 |  1 |   8 | 
|   2 |  1 |  2 |   4 | 
|   3 |  1 |  2 |   4 | 
|   1 |  1 |  3 |   16 | 
+-------------+--------+---------+-------------+ 

私はまだ、各従業員が個別にタスクに費やしたtotal_hoursを示す一方で、タスクとプロジェクトによってグループ化total_hoursを合計します。私が探している出力はこの

Desired Output 
+------------------+----------------+------------+-----------+-------------+ 
| project_name | task_name | first_name | last_name | total_hours | 
+------------------+----------------+------------+-----------+-------------+ 
| Big Project  | Check Work  | Alice  | Green  |   12 | 
| Big Project  | Check Work  | Bob  | Smith  |   4 | 
| Big Project  | Check Work  | Charlie | Brown  |   8 | 
| Big Project  | Check Work  | NULL  | NULL  |   24 | 
| Big Project  | Fix Code  | Bob  | Smith  |   4 | 
| Big Project  | Fix Code  | Charlie | Brown  |   4 | 
| Big Project  | Fix Code  | NULL  | NULL  |   8 | 
| Big Project  | NULL   | NULL  | NULL  |   32 | 
| Internal Project | Rebuild Office | Alice  | Green  |   16 | 
| Internal Project | Rebuild Office | NULL  | NULL  |   16 | 
| Internal Project | NULL   | NULL  | NULL  |   16 | 
+------------------+----------------+------------+-----------+-------------+ 

ようなものになるだろう、私は一緒に関連するテーブルを結合するクエリを作成するために管理、さらにはPROJECT_ID、TASK_IDとRESOURCE_IDでGROUPそれらに管理してきました。ただし、WITH ROLLUPステートメントをクエリの末尾に追加すると、WITH ROLLUPステートメントがなくても失敗します。

これは私の現在のクエリです:

SELECT 
    t1.project_name, 
    t1.task_name, 
    t2.first_name, 
    t2.last_name, 
    SUM(t1.task_hours) 
FROM (
    SELECT 
     Projects.project_id, 
     Projects.name AS project_name, 
     Tasks.task_id, 
     Tasks.name AS task_name, 
     Resources.resource_id, 
     Task_Details.total_hours AS task_hours 
    FROM 
     Projects 
    RIGHT OUTER JOIN 
     Tasks 
    ON 
     Projects.org_id = Tasks.org_id AND 
     Projects.project_id = Tasks.project_id 
    LEFT OUTER JOIN 
     Task_Details 
    ON 
     Task_Details.org_id = Tasks.org_id AND 
     Task_Details.task_id = Tasks.task_id 
    LEFT OUTER JOIN 
     Resources 
    ON 
     Resources.org_id = Task_Details.org_id AND 
     Resources.resource_id = Task_Details.resource_id 
    WHERE 
     Projects.org_id = 1 
) AS t1 
JOIN (
    SELECT 
     resource_id, 
     first_name, 
     last_name 
    FROM 
     Resources 
    WHERE 
     org_id = 1 
) AS t2 
ON 
    t2.resource_id = t1.resource_id 
GROUP BY 
    t1.project_id, 
    t1.task_id, 
    t1.resource_id; 

は、どのように私はWITH ROLLUPが機能することを、私のクエリは、このような変更ができますか?あなたはGROUP BYではないいくつかの列を選択:

私SQLFiddleが、これがあるhereですが、特にMySQLの5.6ではなく5.7

+0

エラーで失敗しますか?それは何と言うのですか?予期しない結果セットで「失敗」しますか? →出力は何ですか? – nCessity

答えて

0

IMHO、あなたのクエリに問題のためです。これは、列内のいくつかの非センシティブな値をもたらす。first_name,last_name,project_nameおよびtask_name。しかし、合計の列はおそらく正しいでしょうか?

これは私の作品:ネストされたSELECTは面白い仕事をし

SELECT p.name as project_name, 
    s1.task_name, 
    first_name, 
    last_name, 
    s1.total_hours 
    FROM (
     SELECT 
     t.project_id, 
     t.name as task_name, 
     h.resource_id, 
     sum(h.total_hours) as total_hours 
     FROM Task_Details as h 
     JOIN Tasks as t ON (t.task_id=h.task_id) 
     GROUP BY t.project_id, t.name, h.resource_id WITH ROLLUP 
    ) AS s1 
     LEFT JOIN Resources AS r ON (s1.resource_id=r.resource_id) 
     JOIN Projects AS p ON (p.project_id=s1.project_id); 

、それはすべてのresource_idのtotal_hours、あらゆるtask_nameと、すべてのproject_idを合計。ネストされたSELECTは、すべてのリソースとプロジェクトの名前を収集します。

OUTPUT:

+------------------+----------------+------------+-----------+-------------+ 
| project_name  | task_name  | first_name | last_name | total_hours | 
+------------------+----------------+------------+-----------+-------------+ 
| Big Project  | NULL   | NULL  | NULL  |   32 | 
| Big Project  | Check Work  | Alice  | Green  |   12 | 
| Big Project  | Check Work  | NULL  | NULL  |   24 | 
| Big Project  | Check Work  | Bob  | Smith  |   4 | 
| Big Project  | Check Work  | Charlie | Brown  |   8 | 
| Big Project  | Fix Code  | Bob  | Smith  |   4 | 
| Big Project  | Fix Code  | Charlie | Brown  |   4 | 
| Big Project  | Fix Code  | NULL  | NULL  |   8 | 
| Internal Project | NULL   | NULL  | NULL  |   16 | 
| Internal Project | Rebuild Office | NULL  | NULL  |   16 | 
| Internal Project | Rebuild Office | Alice  | Green  |   16 | 
+------------------+----------------+------------+-----------+-------------+ 

は、この情報がお役に立てば幸いです。

+0

ああ、そうです。私は問題を逆向きに見ていましたが、最初に和を得てからそれに加わるとは思っていませんでした。ありがとうございました – proteopneum

関連する問題