如何根据重复的行值合并聚合函数结果 | 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 bysum 如下:

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 甲骨文的主要内容,如果未能解决你的问题,请参考以下文章

动态 SQL 透视查询中的分组和聚合函数

根据R中的行值合并Dataframe

如何在 SQL SERVER 2017 SSMS 中用以前保存的行值替换行值

SQL LEFT JOIN 不重复相同的行值

如何通过窗口函数过滤聚合函数的 SQL 语句中的行?

如何将单独列中冒号前后的单词拆分为sql中的行