【问题标题】:SQL SELECT query to pull data from tables to calculate a sumSQL SELECT 查询从表中提取数据以计算总和
【发布时间】:2016-04-17 11:58:38
【问题描述】:

我在数据库中有四个表,我想做的基本上是列出他们正在从事的任何项目的员工编号、部门编号以及他们在项目上花费的总小时数。

我试图将这一切作为一个单一的SELECT 语句来完成,但在让它与 Oracle SQL 一起工作时遇到了麻烦。我最近的尝试是

SELECT EMPLOYEE.E#, EMPLOYEE.NAME, SUM(WORKSON.HOURS)
FROM EMPLOYEE JOIN WORKSON ON EMPLOYEE.E#=WORKSON.E#
GROUP BY EMPLOYEE.E#;

这甚至不是完整的陈述,并给了我错误:

ERROR at line 1:
ORA-00979: not a GROUP BY expression

我可以做些什么来完成声明以包括部门编号以及我应该做什么?我应该为此使用联接吗?还是应该在 WHERE 子句中加入另一个 SELECT 语句?

表格如下:

EMPLOYEE:

SQL> SELECT * FROM EMPLOYEE;            

E#    NAME               DOB         S  SALARY SUPER    D#
----- ------------------ ----------- -- ------ -------- ---
00100 Albert             13-OCT-65   M   186.5
00110 Alvin              13-OCT-77   M   156.4 00100      1
00120 Alice              17-JUN-73   F   156.5 00100      2
00150 Bob                02-JUL-60   M   166.4 00100      3
00200 Carl               02-FEB-67   M   156.3 00100      4
00250 Douglass           14-APR-83   M   156.4 00100      5
00101 Peter              13-NOV-76   M    85.2 00110      1
00103 Ami                12-SEP-85   F    78.2 00110      1
00107 Wendy              12-SEP-88   F    68.2 00110      1
00109 Michael            12-SEP-90   M    58.2 00110      1
00125 Angela             20-NOV-90   F    56.4 00120      2
00105 Robert             15-JAN-86   M    66.2 00150      3
00136 Aban               15-JAN-90   M    55.3 00200      4
00187 Eadger             07-APR-86   M    76.5 00250      5

14 rows selected.

WORKSON:

SQL> SELECT * FROM WORKSON;

E#    P#      HOURS
----- ------- -----
00110    1001    10
00101    1001    20
00150    1002    10
00105    1002    10
00105    1003    20
00105    1004    20
00250    1004    15
00187    1004    25
00105    1005    15

DEPARTMENT:

SQL> SELECT * FROM DEPARTMENT;

D# DNAME              MANAG  MSDATE
-- ------------------ ------ ------------
 1 SALES              00110  02-JAN-12
 2 ACCOUNTING         00120  30-OCT-10
 3 GAMES              00150  01-MAR-08
 4 HUMAN RESOURCES    00200  02-JAN-13
 5 SPORTS             00250  10-MAY-10

PROJECT:

SQL> SELECT * FROM PROJECT;

    P# PTITLE             SPONSOR                D#  BUDGET
------ --- -------------- ---------------------- --- -------
  1001 Computation        Microsoft               1    25000
  1002 Study methods      Education committee     3    15000
  1003 Racing car         Cloud Pty Ltd           3   225000
  1004 Football           Football club           5    35000
  1005 Swimming           Education committee     5   125000

任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 在使用 Group By 子句时,您需要按选择中的所有非聚合列进行分组。所以按 Employee.E#、Employee.name 分组。自己试试。你非常接近答案。您正在朝着正确的方向思考。是的,您可能需要更多连接。

标签: sql oracle select


【解决方案1】:

您首先找到每个员工的小时数总和,然后将其加入您的主表。内联视图也可以使用。

SELECT EMPLOYEE.E#, EMPLOYEE.NAME, NVL(WORKSON_AGGR.TOTAL_HOURS,0)
FROM EMPLOYEE
  LEFT JOIN  (SELECT E#, SUM(HOURS) as TOTAL_HOURS
                FROM WORKSON
          GROUP BY E# ) WORKSON_AGGR
     ON (WORKSON_AGGR.E# = EMPLOYEE.E#)

现在,您可以轻松加入部门表了。

SELECT 
     E.E#,
     E.NAME,
     NVL(WORKSON_AGGR.TOTAL_HOURS,0),
     D.DNAME
FROM EMPLOYEE E
  LEFT JOIN  (SELECT E#, SUM(HOURS) as TOTAL_HOURS
                FROM WORKSON
             GROUP BY E# ) WORKSON_AGGR
     ON (WORKSON_AGGR.E# = E.E#)
  JOIN DEPARTMENT D ON (D.D# = E.D#)

【讨论】:

  • ON (WORKSON_AGGR.E# = EMPLOYEE.E#) 行抛出错误 ORA-00904: "EMPLOYEE"."E#": invalid identifier,我似乎无法弄清楚
  • @SteppingHat 好的.. 它是ON (WORKSON_AGGR.E# = E.E#)
  • 太棒了!奇迹般有效。所以为了弄清楚你加入EMPLOYEEWORKSON 以获得总小时数,然后你加入DEPARTMENT 之后只是为了 D#。但有一件事我不明白,WORKSON_AGGR 是什么?
  • 那是inline view。你可以看到,它是如何在FROM 子句中定义的。 JOIN (SELECT E#, SUM(HOURS) as TOTAL_HOURS FROM WORKSON GROUP BY E# ) WORKSON_AGGR .... 座右铭是首先找到每个员工的小时总和,然后创建一个JOIN。通过这种方式,您的外部 SELECT 变得简单,您可以添加任何列,而无需担心添加 GROUP BY 子句。
  • 好吧,这是有道理的。但是假设我然后做一个LEFT JOIN 来显示没有工作时间的员工,我如何让它显示 0 而不是空字段?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多