2013-12-19 55 views
0

我想选择谁已经比平均总时间,任何人都已经工作,一个阵营的Oracle SQL子查询

表是人与计划工作较少的人

这是我到目前为止有:

SELECT fname AS "First Name", lname AS "Last Name", 
SUM((end_time - start_time) * 24)   
FROM person JOIN schedule USING (person_ID) 
GROUP BY fname 
HAVING SUM((end_time - start_time) * 24) < (
SELECT AVG(SUM((end_time - start_time) * 24)) FROM schedule);` 

人有FNAME,LNAME和PERSON_ID 时间表sched_id,s_date,START_TIME,END_TIME和PERSON_ID

谢谢!

收到此错误:

Error starting at line 18 in command: 
    SELECT fname AS "First Name", lname AS "Last Name", 
    SUM((end_time - start_time) * 24)  
    FROM person JOIN schedule USING (person_ID) 
    GROUP BY fname 
    HAVING SUM((end_time - start_time) * 24) < (
    SELECT AVG(SUM((end_time - start_time) * 24)) FROM schedule) 
    Error at Command Line:18 Column:31 
    Error report: 
    SQL Error: ORA-00979: not a GROUP BY expression 
    00979. 00000 - "not a GROUP BY expression" 
    *Cause:  
    *Action: 
+0

您必须将select中的所有非聚合列包含在group by子句中。 – OldProgrammer

回答

1

本集团需要包括在你的SELECT语句中的所有非聚集的领域(所以一切除了SUM()在这种情况下)。

尝试将其更改为:

GROUP BY fname, lname 
0

当使用聚合函数,如SUM,您将需要通过包括该组中的所有非集合属性:

SELECT fname AS "First Name", lname AS "Last Name", 
SUM((end_time - start_time) * 24)   
FROM person JOIN schedule USING (person_ID) 
GROUP BY fname, lname --this is changed 
HAVING SUM((end_time - start_time) * 24) < (
SELECT AVG(SUM((end_time - start_time) * 24)) FROM schedule);` 
+0

现在说的是 命令行错误:27列:16 错误报告: SQL错误:ORA-00978:没有GROUP BY的嵌套组函数 00978. 00000 - “没有GROUP BY的嵌套组函数” – user3038436

0

我想解决此问题的最佳方法是使用分析函数:

select "First Name", "Last Name", hours 
from (SELECT fname AS "First Name", lname AS "Last Name", 
      SUM((end_time - start_time) * 24) as hours, 
      avg(SUM((end_time - start_time) * 24)) over() as avghours 
     FROM person JOIN 
      schedule 
      USING (person_ID) 
     GROUP BY fname, lname 
    ) t 
WHERE hours < avghours; 

报告的特定问题Oracle是avg(sum())不允许用于group by(除非,如上所述,avg()实际上是一个分析函数)。