Oracle SQL 查询问题

Posted

技术标签:

【中文标题】Oracle SQL 查询问题【英文标题】:Oracle SQL query question 【发布时间】:2011-04-12 15:55:15 【问题描述】:

我正在尝试完成这个 Oracle SQL 查询,但没有成功。

"列出平均成本最低的部门。(提示:SELECT MIN(AVG(cost))只要在SELECT语句中没有组合其他列就有效。您可以将以上作为子查询与另一个查询组合)"

我能够让它以平均成本显示部门,但是当我尝试在 MIN 工作时它会中断。这是我目前所拥有的。

SELECT DeptNo, AVG(projcost) FROM projects, clinicians WHERE clinicians.Clinicianno = projects.Clinicianno GROUP BY DeptNo;

这会给我部门和他们的 AVG,但是当我将 AVG(projcost) 更改为 MIN(AVG(projcost) 时,它会中断。提示是使其成为子查询,但我不知道如何做到这一点。任何帮助将不胜感激。

【问题讨论】:

子查询是查询中的查询。我不会给你答案,但这里有一个描述子查询的链接:[Oracle Subquery on Tech on the net][1]。我认为你会从作业中得到更多,学习如何自己做,而不是去寻找别人的答案。 [1]:techonthenet.com/oracle/subqueries.php @Bernard 错误:此处不允许使用群组功能。 【参考方案1】:
SELECT 
  MIN(q1.AvgProjCost)
FROM (SELECT 
        DeptNo, 
        AVG(projcost) as AvgProjCost 
      FROM projects, clinicians 
      WHERE clinicians.Clinicianno = projects.Clinicianno 
      GROUP BY DeptNo) q1

已编辑 假设我有以下部门项目费用

Department ProjectCost
1          15
1          15
1          15
2          16
2          16
3          17
3          17
4          18

这些项目成本将呈现以下平均值

Department Average
1          15
2          16
3          17
4          18

每个部门的最小平均值仍然是相同的结果集。

再次编辑

如果您确实必须为每个部门设置最低平均值,那么这将起作用

SELECT 
  q1.Dept,
  MIN(q1.AvgProjCost)
FROM (SELECT 
        DeptNo, 
        AVG(projcost) as AvgProjCost 
      FROM projects, clinicians 
      WHERE clinicians.Clinicianno = projects.Clinicianno 
      GROUP BY DeptNo) q1
GROUP BY q1.Dept

但是您很快就会意识到,这个结果集现在并且将永远与

      SELECT 
        DeptNo, 
        AVG(projcost) as AvgProjCost 
      FROM projects, clinicians 
      WHERE clinicians.Clinicianno = projects.Clinicianno 
      GROUP BY DeptNo

再次编辑

求平均工程成本最小的部门

SELECT 
  q1.Dept,
  q1.AvgProjCost
FROM (SELECT 
        DeptNo, 
        AVG(projcost) as AvgProjCost 
      FROM projects, clinicians 
      WHERE clinicians.Clinicianno = projects.Clinicianno 
      GROUP BY DeptNo) q1
WHERE rownum = 1
ORDER BY AvgProjCost DESC

【讨论】:

那个是迄今为止最接近的,除了输出只显示最低的 MIN(AVG()) 并且不显示 DeptNo。 @LunarZer0 好的,所以如果您按 DeptNo 进行平均(项目成本)分组,那么您将获得每个部门的 1 行。如果您获得刚刚查询的平均值的最小值,按部门分组,您将获得相同的结果。在我的回答中查看我的编辑 您的解决方案确实可以为我提供最低的部门平均值,但是问题很简单,他们希望输出显示“DeptNo, Min(AVG(projcost))”,它只给出me "MIN(AVG(projcost))" 我正在尝试在 DeptNo 输出中工作。 @LunarZer0 您最后的评论似乎不完整 @John 是的,我在打字时不小心按了 Enter 按钮。我确实对其进行了编辑以完成句子。如果您看不到编辑,请告诉我。【参考方案2】:

试试这个:

WITH avgData AS
SELECT a.*,
             RANK() OVER(ORDER BY avg_cost) RN
  FROM 
    (
        SELECT  DeptNo, 
                    AVG(projcost) avg_cost,
                    projects.ROWNUM rn
        FROM    projects, 
                    clinicians 
        WHERE   clinicians.Clinicianno = projects.Clinicianno 
        GROUP BY DeptNo
    ) a
SELECT *
  FROM avgData
 WHERE RN = 1

【讨论】:

【参考方案3】:

选择前 1 个 部门号 ,AVG(项目成本) 从 项目 , 临床医生 在哪里 临床医生.Clinicianno = 项目.Clinicianno 通过...分组 部门号 订购方式 AVG(项目成本);

【讨论】:

【参考方案4】:

试试这个....

样本数据

DEPTNO| AVG_COST 100 |8601.333333 30 |4150 90 |19333.33333 20 |9500 70 |10000 110 |10154 50 |3475.555556 80 |8955.882353 40 |6500 60 |5760 10 |4400

SELECT DEPTNO,AVG_COST FROM (SELECT P.DEPTNO, (AVG(C.COST)) AVG_COST FROM PROJECTS P, CLINICIANS C WHERE P.DEPTNO=C.DEPTNO GROUP BY P.DEPTNO ) WHERE AVG_COST= (SELECT MIN(AVG_COST) FROM (SELECT P.DEPTNO, (AVG(C.COST)) AVG_COST FROM PROJECTS P, CLINICIANS C WHERE P.DEPTNO=C.DEPTNO GROUP BY P.DEPTNO ) );

上面的查询会给你下面的结果

DEPTNO| AVG_COST 50 |3475.555556

【讨论】:

以上是关于Oracle SQL 查询问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql查询求助

oracle中查询和定位数据库问题的SQL语句

oracle 中SQL语句查询的问题,分类统计汇总为和

oracle sql 字符串拆分的查询的问题,急!!!

oracle sql语句的union效率问题【急】【急】【急】

Oracle 中最耗时的 5 个 SQL 查询