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 查询问题的主要内容,如果未能解决你的问题,请参考以下文章