[英]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.