如何根据重复的行值合并聚合函数结果 | SQL 甲骨文
Posted
技术标签:
【中文标题】如何根据重复的行值合并聚合函数结果 | SQL 甲骨文【英文标题】:How to amalgamate aggregate function results, based on duplicate row values | SQL Oracle 【发布时间】:2021-04-16 16:13:24 【问题描述】:我正在尝试找出员工在 12 月份在每个项目上工作的小时数...
使用 Oracle DBMS。
到目前为止,我有以下...
SELECT c.clock_id, p.project_name, e.employee_first_name, e.employee_last_name,
(clock_out - clock_in) * 24 AS hrs_worked_dec
FROM clock c
LEFT JOIN employee e
ON c.employee_id = e.employee_id
LEFT JOIN project p
ON p.project_id = c.project_id
WHERE clock_in LIKE '%DEC%';
目前,这是根据 clock_in 和 clock_out 列的计算列出我时钟表中的所有小时。
但是,我希望合并这些结果,以便它们显示每个项目的每个员工的总和,以提供更清晰的结果。
感谢有关如何合并结果的任何帮助或指导 :-)
【问题讨论】:
【参考方案1】:您只需要GROUP BY
子句和SUM()
聚合
SELECT p.project_name, e.employee_id, e.employee_first_name, e.employee_last_name,
SUM((clock_out - clock_in) * 24) AS hrs_worked_dec
FROM clock c
LEFT JOIN employee e
ON c.employee_id = e.employee_id
LEFT JOIN project p
ON p.project_id = c.project_id
WHERE clock_in LIKE '%DEC%'
GROUP BY p.project_name, e.employee_id, e.employee_first_name, e.employee_last_name
GROUP BY
列表中的最后三列分别代表每个不同的员工
【讨论】:
哇,非常感谢!我一直在绞尽脑汁想弄清楚这一点。非常感谢:-) 不客气@rrup,请将答案标记为帮助。【参考方案2】:为什么需要LEFT JOIN
?您是否期望在没有员工或项目的情况下上班?你应该使用INNER JOIN
而你的解决方案很简单group by
和sum
如下:
SELECT p.project_name, e.employee_id, e.employee_first_name, e.employee_last_name,
SUM((clock_out - clock_in) * 24) AS hrs_worked_dec
FROM clock c JOIN employee e ON c.employee_id = e.employee_id
JOIN project p ON p.project_id = c.project_id
WHERE c.clock_in LIKE '%DEC%'
GROUP BY p.project_name, e.employee_id, e.employee_first_name, e.employee_last_name
此外,clock_in
中的DEC
将包含所有 12 月的数据(2020 年、2019 年……),因此请谨慎使用。
【讨论】:
是的,任何clock_in 都将始终具有employee_id 和project_id,因为这是复合键。这次真是万分感谢! :-)以上是关于如何根据重复的行值合并聚合函数结果 | SQL 甲骨文的主要内容,如果未能解决你的问题,请参考以下文章