2017-06-12 27 views
1

我有4個表格,我想用MySQL 5.7來彙總數據。如何在獨立表上的多列上滾動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語句會導致它失敗,即使它沒有運行。

這是我當前的查詢:

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; 

如何修改我的查詢,使得與ROLLUP作品?

我SQLFiddle是here,但特別是MySQL 5.6,而不是5.7

+0

它是否因錯誤而失敗? - >它說什麼?它是否會因意外結果集「失敗」? - >輸出是什麼? – nCessity

回答

0

恕我直言,你的查詢問題是這樣的:你選擇一些列這是不是在GROUP BY。這在列first_name,last_name,project_nametask_name的列中導致一些非感性值。但是,總和列可能是正確的,不是嗎?

這個工作對我來說:

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); 

嵌套SELECT做了有趣的工作,它總結了每resource_id的total_hours,每task_name和每project_id。嵌套0​​然後收集每個資源和項目的名稱。

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