PL/SQL Challenge 每日一题:2020-5-26 GROUP BY

[复制链接]
查看11 | 回复3 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
每两周的优胜者可获得itpub奖励的技术图书一本。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Chris Saxon
运行环境:SQLPLUS, SERVEROUTPUT已打开, 最低版本要求:11.2
注:本题给出答案时候要求给予简要说明才能得到奖品
你执行了这些语句:
create table qz_bricks (
brick_id integer
not null primary key,
colour varchar2(10)
not null,
shapevarchar2(10)
not null,
weight integer
not null
);
insert into qz_bricks
values ( 1, 'blue', 'cylinder', 1 );
insert into qz_bricks
values ( 2, 'blue', 'cylinder', 1 );
insert into qz_bricks
values ( 3, 'green', 'cube', 2 );
insert into qz_bricks
values ( 4, 'green', 'cylinder', 3 );
insert into qz_bricks
values ( 5, 'red', 'cube', 5 );
insert into qz_bricks
values ( 6, 'red', 'cube', 8 );
insert into qz_bricks
values ( 7, 'red', 'cylinder', 13 );

commit;
哪些查询会找到这些数据:
颜色是红色
每种形状的总重量
该种形状的总重量必须大于10?
正确的选项应该返回这些行:
SHAPETOTAL_WEIGHT
---------- ------------
cube
13
cylinder
13
(A)
select shape, sum ( weight ) total_weight
from qz_bricks
wherecolour = 'red'
andsum ( weight ) > 10
groupby shape
orderby shape;
(B)
select shape, sum ( weight ) total_weight
from qz_bricks
wherecolour = 'red'
groupby shape
having sum ( weight ) > 10
orderby shape ;
(C)
select shape, sum ( weight ) total_weight
from qz_bricks
groupby shape
having sum ( weight ) > 10
andcolour = 'red'
orderby shape ;
(D)
select shape, sum ( weight ) total_weight
from qz_bricks
groupby shape
having sum ( weight ) > 10
andmax ( colour ) = 'red'
orderby shape ;
(E)
select shape, total_weight
from (
select shape, sum ( weight ) total_weight
from qz_bricks
wherecolour = 'red'
groupby shape
)
wheretotal_weight > 10
orderby shape ;

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案 BE

A)错误,ORA-00934: 此处不允许使用分组函数
聚合数据sum(weight)只能出现在having后面,不能出现在where子句后面
B)正确,修复了A的问题,sum(weight)调整到了having子句后面
C)错误,ORA-00979: 不是 GROUP BY 表达式
having子句后面需要跟聚合数据,不能直接带列
D)错误,语句正常输出,但是代码逻辑与题目意思不符合
colour = 'red'这个过滤列没有生效
根据shape分组,cube= 5+ 8+ 2 = 15,cylinder = 1+1+3+13 = 18

E)正确,通过临时表和where子句,替代了having子句的功能

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层

答案:BE
A: 分组函数不能出现在WHERE子句中
B: 分组过滤用having 子句,推荐写法
C: colour 不是group by 表达式
D: 没有where 子句,group by后按 shape累加,所有颜色都计算进去了。
max ( colour ) = 'red',过滤的分组,所有颜色还是计算进去了
E: 外层查询作用和having 子句相同,但不如having 子句简洁
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案BE, 2楼得奖。
A:
你不能在WHERE子句中调用聚合函数。这样会报错:
"ORA-00934: group function is not allowed here"
B:
WHERE子句将搜索限制在红色行中。而HAVING过滤掉了那些总重量小于或等于10的形状。所以这样就得到了预期的结果。
C:
HAVING子句中的列必须在聚合函数中使用,或者在GROUP BY子句中出现。COLOUR这两种情况都不是。所以这会报错:
"ORA-00979: not a GROUP BY expression"
D:
此项搜索所有总重量大于10且颜色最大值为红色的形状。这两个图形至少有一行是红色。所以这个返回的结果是:
SHAPETOTAL_WEIGHT
---------- ------------
cube
15
cylinder
18
E:
子查询找到每个形状的红色砖块的总重量。而外部查询则将其过滤到总重量大于10的形状。这样就会返回所要求的结果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行