SQL join后按多个字段分组
P粉616383625
P粉616383625 2024-04-03 12:25:01
0
2
401

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

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粉616383625
P粉616383625

全部回复(2)
P粉883278265

大概是这样的:

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
P粉674999420

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!