【问题标题】:How to ROLLUP a SUM over multiple columns on separate tables?如何在不同表上的多个列上汇总总和?
【发布时间】:2017-06-13 06:01:55
【问题描述】:

我有 4 个表,我想使用 MySQL 5.7 从其中聚合数据。

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 对它们进行了分组。但是,在我的查询末尾添加 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 起作用?

我的 SQLFiddle 是 here,但值得注意的是 MySQL 5.6 而不是 5.7

【问题讨论】:

  • 它是否因错误而失败? -> 它说什么?它是否因意外的结果集而“失败”? -> 输出是什么?

标签: mysql


【解决方案1】:

恕我直言,您查询的问题是:您选择了一些不在GROUP BY 中的列。这会导致first_namelast_nameproject_nametask_name 列中出现一些无意义的值。但是,sum 列可能是正确的,不是吗?

这对我有用:

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、每个task_name 和每个project_id 的total_hours。嵌套SELECT 然后收集每个资源和项目的名称。

输出:

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

希望这会有所帮助。

【讨论】:

  • 啊,我明白了。我正在向后看问题,没想到先得到总和然后再加入。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多