SAS中文论坛
标题:
跟crackman做sas adv认证试题(5)
[打印本页]
作者:
shiyiming
时间:
2010-11-16 15:01
标题:
跟crackman做sas adv认证试题(5)
From crackman's blog on Baidu
<p><font size="4" face="宋体">The table WORK.PILOTS contains the following data:<br>
<br>
WORK.PILOTS<br>
<br>
Id Name Jobcode Salary<br>
--- ------ ------- ------<br>
001 Albert PT1 50000<br>
002 Brenda PT1 70000<br>
003 Carl PT1 60000<br>
004 Donna PT2 80000<br>
005 Edward PT2 90000<br>
006 Flora PT3 100000<br>
<br>
The data set was summarized to include average<br>
salary based on jobcode: <br>
<br>
Jobcode Salary Avg <br>
------- ------ ----- <br>
PT1 50000 60000 <br>
PT1 70000 60000 <br>
PT1 60000 60000 <br>
PT2 80000 85000 <br>
PT2 90000 85000 <br>
PT3 100000 100000 <br>
<br>
Which SQL statement could NOT generate <br>
this result? </font></p>
<p><br>
<font size="4" face="宋体"> A.<br>
select <br>
Jobcode, <br>
Salary, <br>
avg(Salary) label='Avg' <br>
from WORK.PILOTS<br>
group by Jobcode<br>
order by Id <br>
; <br>
<br>
B.<br>
select <br>
Jobcode, <br>
Salary, <br>
(select avg(Salary) <br>
from WORK.PILOTS as P1 <br>
where P1.Jobcode=P2.Jobcode) as Avg <br>
from WORK.PILOTS as P2 <br>
order by Id <br>
; <br>
<br>
C.<br>
select <br>
Jobcode, <br>
Salary, <br>
(select avg(Salary) <br>
from WORK.PILOTS <br>
group by Jobcode) as Avg <br>
from WORK.PILOTS<br>
order by Id <br>
; <br>
<br>
D.<br>
select <br>
Jobcode, <br>
Salary, <br>
Avg <br>
from <br>
WORK.PILOTS, <br>
(select <br>
Jobcode as Jc, <br>
avg(Salary) as Avg<br>
from WORK.PILOTS <br>
group by 1)<br>
where Jobcode=Jc<br>
order by Id </font></p>
<p><font size="4" face="宋体">答案是C.<br>
本文属于博客:</font><a href="http://hi.baidu.com/crack_man/home"><font size="4" face="宋体"><!-- m --><a class="postlink" href="http://hi.baidu.com/crack_man/home">http://hi.baidu.com/crack_man/home</a><!-- m --></font></a><font size="4" face="宋体"> 版权归作者所有,欢迎转载!如有转载,请务必注明出处!未经</font></p>
<p><font size="4" face="宋体">本文作者同意不得用于商业应用。</font></p>
<p><font size="4" face="宋体">这道题考察的SQL语句的多个方面的知识和技巧。下面就每一个答案来做解析:<br>
A:<br>
select id,Jobcode,Salary,avg(Salary) label='Avg' from WORK.PILOTS<br>
group by Jobcode order by Id ;<br>
这条语句是利用SQL过程中的AVG函数,计算某一列的均值。本语句中,先按照JOBCODE分组计算SALARY的均值,然后按照</font></p>
<p><font size="4" face="宋体">ID这个变量排序输出结果。ID的默认排序是升序,<br>
这个升序是作用了全部数据集,不是针对分组的排序的。<br>
关于是不是分组,可以有如下程序示例:<br>
data pilots;<br>
input id name $ jobcode $ salary@;<br>
datalines;<br>
001 Albert PT1 50000<br>
002 Brenda PT1 70000<br>
003 Carl PT1 60000<br>
008 crack PT1 100000<br>
004 Donna PT2 80000<br>
005 Edward PT2 90000<br>
006 Flora PT3 100000<br>
;<br>
run;<br>
proc sql;<br>
select id,<br>
Jobcode, <br>
Salary, <br>
avg(Salary) label='Avg' <br>
from WORK.PILOTS<br>
group by Jobcode <br>
/*先去掉这句话,然后加上这句话,看看结果<br>
order by Id <br>
*/<br>
;<br>
quit;<br>
B:<br>
select Jobcode, Salary, (select avg(Salary) from WORK.PILOTS as P1 where P1.Jobcode=P2.Jobcode) as Avg <br>
from WORK.PILOTS as P2 order by Id ; <br>
执行时转化为下面语句:<br>
select P2.jobcode, P2.salary,<br>
( select AVG(P1.salary)<br>
from WORK.PILOTS P1<br>
where P1.jobcode = P2.jobcode<br>
) as Avg<br>
from WORK.PILOTS P2<br>
order by P2.id asc;<br>
这里利用的是自身的数据集,分别设置不同的别名,可以当做两个数据集来使用。不过这里WHERE语句很值得学习,我个</font></p>
<p><font size="4" face="宋体">人对这里的WHERE语句这样理解的:(select avg(Salary) from WORK.PILOTS as P1 where P1.Jobcode=P2.Jobcode)启示</font></p>
<p><font size="4" face="宋体">执行之后返回的是三个AVG均值,但是因为这三个AVG均值都是与JOBCODE匹配的<br>
,那么前面的select Jobcode, Salary,</font></p>
<p><font size="4" face="宋体">所以当执行到(select avg(Salary) from WORK.PILOTS as P1 where P1.Jobcode=P2.Jobcode)这里时,实际上是选择了</font></p>
<p><font size="4" face="宋体">select jobcode 中jobcode对应的avg均值。</font></p>
<p><font size="4" face="宋体">C:<br>
select Jobcode,Salary,(select avg(Salary) from WORK.PILOTS group by Jobcode) as Avg <br>
from WORK.PILOTS<br>
order by Id ;<br>
其实C和B有点像,但是C是错误,因为C中“select avg(Salary) from WORK.PILOTS group by Jobcode”一次返回的不是</font></p>
<p><font size="4" face="宋体">一个值,而是一组数值。</font></p>
<p><font size="4" face="宋体">D:<br>
select Jobcode,Salary,Avg from WORK.PILOTS,(select Jobcode as Jc,avg(Salary) as Avg <br>
from WORK.PILOTS group by 1)<br>
where Jobcode=Jc<br>
order by Id ;<br>
D实际上是执行两个表的水平连接。第一个是POLOTS,另外一个是子查询得到返回结果。按照JOBCODE条件筛选出结果。<br>
按照ID升序排列。这里子查询中的GROUP BY 1等价于 GROUP BY JC.</font></p>
<p> </p>
<p><font size="4" face="宋体">示例程序:</font></p>
<p><font size="4" face="宋体">data pilots;<br>
input id name $ jobcode $ salary@;<br>
datalines;<br>
001 Albert PT1 50000<br>
002 Brenda PT1 70000<br>
003 Carl PT1 60000<br>
004 Donna PT2 80000<br>
005 Edward PT2 90000<br>
006 Flora PT3 100000<br>
;<br>
run;<br>
proc sql ;<br>
/* A */<br>
select id,<br>
Jobcode, <br>
Salary, <br>
avg(Salary) label='Avg' <br>
from WORK.PILOTS<br>
group by Jobcode <br>
order by Id <br>
;</font></p>
<p><font size="4" face="宋体">/* B*/<br>
select <br>
Jobcode, <br>
Salary, <br>
(select avg(Salary) <br>
from WORK.PILOTS as P1 <br>
where P1.Jobcode=P2.Jobcode) as Avg <br>
from WORK.PILOTS as P2 <br>
order by Id <br>
; </font></p>
<p><font size="4" face="宋体">/* C */<br>
select <br>
Jobcode, <br>
Salary, <br>
(select avg(Salary) <br>
from WORK.PILOTS <br>
group by Jobcode) as Avg <br>
from WORK.PILOTS<br>
order by Id <br>
; <br>
<br>
/* D*/<br>
select <br>
Jobcode, <br>
Salary, <br>
Avg <br>
from <br>
WORK.PILOTS, <br>
(select <br>
Jobcode as Jc, <br>
avg(Salary) as Avg<br>
from WORK.PILOTS <br>
group by 1)<br>
where Jobcode=Jc<br>
order by Id <br>
; <br>
quit;<br>
</font></p> <a href="http://hi.baidu.com/crack%5Fman/blog/item/667f8ed2f61fe13f06088b0e.html">阅读全文</a>
<br/><b>类别:</b><a href="http://hi.baidu.com/crack%5Fman/blog/category/%B8%FAcrackman%D7%F6sas%20adv%C8%CF%D6%A4%CA%D4%CC%E2">跟crackman做sas adv认证试题</a> <a href="http://hi.baidu.com/crack%5Fman/blog/item/667f8ed2f61fe13f06088b0e.html#comment">查看评论</a>
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2