搜索

首页  >  问答  >  正文

SQL join后按多个字段分组

我编写了以下查询,该查询正确连接了两个表,该表显示团队中个人完成的任务数量以及这些任务的相关成本:

SELECT users.id AS user_id, 
users.name, 
COALESCE(tasks.cost, 0) AS cost,
tasks.assignee,
tasks.completed,
tasks.completed_by
FROM users
JOIN tasks
ON tasks.assignee = users.id
WHERE completed IS NOT NULL AND assignee IS NOT NULL

这提供了下表:

用户 ID 姓名 受让人 成本 已完成 完成时间
18 迈克 8 0.25 2022-01-24 19:54:48 8
13 凯蒂 13 0 2022-01-24 19:55:18 8
13 凯蒂 13 0 2022-01-25 11:49:53 8
12 吉姆 12 0.5 2022-01-25 11:50:02 12
9 奥利 9 0.25 2022-03-03 02:38:41 9

我现在想进一步查找按名称和完成月份分组的成本总和。但是,我无法在当前的 select 和 WHERE 子句之后计算出 GROUP BY 的语法。最终,我希望查询返回如下内容:

姓名 cost_sum
迈克 62 一月
凯蒂 20 一月
吉姆 15 一月
奥利 45 一月
迈克 17 二月

我尝试了各种组合和嵌套 GROUP BY 子句,但似乎无法获得所需的结果。任何指示将不胜感激。

P粉616383625P粉616383625230 天前459

全部回复(2)我来回复

  • P粉883278265

    P粉8832782652024-04-04 11:06:54

    大概是这样的:

    SELECT users.name, tasks.completed_by month, sum(COALESCE(tasks.cost, 0)) cost_sum
    FROM users
    JOIN tasks
    ON tasks.assignee = users.id
    WHERE completed IS NOT NULL AND assignee IS NOT NULL
    group by users.name, tasks.completed_by

    回复
    0
  • P粉674999420

    P粉6749994202024-04-04 10:34:09

    users 加入一个查询,该查询聚合在 tasks 中并返回特定年份每月的总成本:

    SELECT u.name, 
           COALESCE(t.cost, 0) AS cost,
           DATE_FORMAT(t.last_day, '%M')
    FROM users u
    INNER JOIN (
      SELECT assignee, LAST_DAY(completed) last_day, SUM(cost) AS cost
      FROM tasks
      WHERE YEAR(completed) = 2022
      GROUP BY assignee, last_day
    ) t ON t.assignee = u.id
    ORDER BY t.last_day;

    不需要检查completednull还是assigneenull,因为nulls在这里被过滤掉了:

    WHERE YEAR(completed) = 2022

    这里:

    ON t.assignee = u.id

    回复
    0
  • 取消回复