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>
&nbsp;&nbsp;  WORK.PILOTS<br>
<br>
&nbsp;&nbsp;  Id&nbsp;&nbsp;  Name&nbsp;&nbsp;&nbsp;&nbsp;  Jobcode  Salary<br>
&nbsp;&nbsp;  ---  ------&nbsp;&nbsp;  -------  ------<br>
&nbsp;&nbsp;  001  Albert&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  50000<br>
&nbsp;&nbsp;  002  Brenda&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  70000<br>
&nbsp;&nbsp;  003  Carl&nbsp;&nbsp;&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  60000<br>
&nbsp;&nbsp;  004  Donna&nbsp;&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  80000<br>
&nbsp;&nbsp;  005  Edward&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  90000<br>
&nbsp;&nbsp;  006  Flora&nbsp;&nbsp;&nbsp;  PT3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  100000<br>
<br>
The data set was summarized to include average<br>
salary based on jobcode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;  Jobcode  Salary&nbsp;&nbsp;&nbsp;&nbsp;  Avg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  -------  ------&nbsp;&nbsp;  -----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  50000&nbsp;&nbsp;  60000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  70000&nbsp;&nbsp;  60000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  60000&nbsp;&nbsp;  60000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  80000&nbsp;&nbsp;  85000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  90000&nbsp;&nbsp;  85000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  PT3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  100000  100000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
Which SQL statement could NOT generate  <br>
this result? </font></p>
<p><br>
<font size="4" face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  A.<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  avg(Salary) label='Avg'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
from WORK.PILOTS<br>
group by Jobcode<br>
order by Id&nbsp;&nbsp;  <br>
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  B.<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  (select avg(Salary)  <br>
&nbsp;&nbsp;  from WORK.PILOTS as P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  where P1.Jobcode=P2.Jobcode) as Avg&nbsp;&nbsp;  <br>
from WORK.PILOTS as P2  <br>
order by Id&nbsp;&nbsp;  <br>
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  C.<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  (select avg(Salary)  <br>
&nbsp;&nbsp;  from WORK.PILOTS&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  group by Jobcode) as Avg&nbsp;&nbsp;&nbsp;&nbsp;  <br>
from WORK.PILOTS<br>
order by Id&nbsp;&nbsp;  <br>
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  D.<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Avg <br>
from&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  WORK.PILOTS, <br>
  (select&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Jobcode as Jc,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  avg(Salary) as Avg<br>
&nbsp;&nbsp;  from WORK.PILOTS&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  group by 1)<br>
where Jobcode=Jc<br>
order by Id&nbsp;&nbsp;  </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>
&nbsp;&nbsp;  001  Albert&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  50000<br>
&nbsp;&nbsp;  002  Brenda&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  70000<br>
&nbsp;&nbsp;  003  Carl&nbsp;&nbsp;&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  60000<br>
&nbsp;&nbsp;  008  crack&nbsp;&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  100000<br>
&nbsp;&nbsp;  004  Donna&nbsp;&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  80000<br>
&nbsp;&nbsp;  005  Edward&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  90000<br>
&nbsp;&nbsp;  006  Flora&nbsp;&nbsp;&nbsp;  PT3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  100000<br>
&nbsp;&nbsp;  ;<br>
&nbsp;&nbsp;  run;<br>
proc sql;<br>
select id,<br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  avg(Salary) label='Avg'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ( select AVG(P1.salary)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  from WORK.PILOTS P1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  where P1.jobcode = P2.jobcode<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ) as Avg<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  from WORK.PILOTS P2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  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&nbsp;&nbsp;&nbsp;&nbsp;  <br>
from WORK.PILOTS<br>
order by Id ;<br>
其实C和B有点像,但是C是错误,因为C中&ldquo;select avg(Salary) from WORK.PILOTS group by Jobcode&rdquo;一次返回的不是</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>
&nbsp;&nbsp;  001  Albert&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  50000<br>
&nbsp;&nbsp;  002  Brenda&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  70000<br>
&nbsp;&nbsp;  003  Carl&nbsp;&nbsp;&nbsp;&nbsp;  PT1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  60000<br>
&nbsp;&nbsp;  004  Donna&nbsp;&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  80000<br>
&nbsp;&nbsp;  005  Edward&nbsp;&nbsp;  PT2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  90000<br>
&nbsp;&nbsp;  006  Flora&nbsp;&nbsp;&nbsp;  PT3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  100000<br>
&nbsp;&nbsp;  ;<br>
&nbsp;&nbsp;  run;<br>
proc sql  ;<br>
/* A */<br>
select id,<br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  avg(Salary) label='Avg'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
from WORK.PILOTS<br>
group by Jobcode  <br>
order by Id <br>
;</font></p>
<p><font size="4" face="宋体">/* B*/<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  (select avg(Salary)  <br>
&nbsp;&nbsp;  from WORK.PILOTS as P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  where P1.Jobcode=P2.Jobcode) as Avg&nbsp;&nbsp;  <br>
from WORK.PILOTS as P2  <br>
order by Id <br>
; </font></p>
<p><font size="4" face="宋体">/* C */<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  (select avg(Salary)  <br>
&nbsp;&nbsp;  from WORK.PILOTS&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  group by Jobcode) as Avg&nbsp;&nbsp;&nbsp;&nbsp;  <br>
from WORK.PILOTS<br>
order by Id&nbsp;&nbsp;  <br>
;  <br>
<br>
/* D*/<br>
select <br>
&nbsp;&nbsp;  Jobcode,&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Salary,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  Avg <br>
from&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  WORK.PILOTS, <br>
  (select&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Jobcode as Jc,&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  avg(Salary) as Avg<br>
&nbsp;&nbsp;  from WORK.PILOTS&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  group by 1)<br>
where Jobcode=Jc<br>
order by Id&nbsp;&nbsp;  <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>&nbsp;<a href="http://hi.baidu.com/crack%5Fman/blog/item/667f8ed2f61fe13f06088b0e.html#comment">查看评论</a>




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2