繁体   English   中英

Oracle SQL子查询

[英]Oracle SQL Subqueries

我想选择工作时间少于任何人平均工作时间和一个营地的人

表是人和时间表

这是我到目前为止所拥有的:

 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:

GROUP BY行需要在SELECT语句中包括所有未聚合的字段(因此,在这种情况下,除了SUM()以外的所有内容)。

尝试将其更改为:

GROUP BY fname, lname

当使用聚合函数(例如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);`

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

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()实际上是一个解析函数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM