SAS中文论坛

标题: SQL语法请教 [打印本页]

作者: shiyiming    时间: 2004-10-8 14:53
标题: SQL语法请教
目的,将样本分为2个组(体重>=100排前面叫A组,体重<100排后面叫B组),AB组再按照年龄排序。
分后的数据应该:
[code:a532b]proc sql noprint;
        create table WORK.CLASS1 as select * from SASHELP.CLASS where WEIGHT>=100;
        create table WORK.CLASS2 as select * from SASHELP.CLASS where WEIGHT<100;
quit;
proc sort data=WORK.CLASS1; by DESCENDING AGE; run;
proc sort data=WORK.CLASS2; by DESCENDING AGE; run;
data WORK.CLASS; set WORK.CLASS1 WORK.CLASS2; run;
proc sql noprint;
        drop table WORK.CLASS1;
        drop table WORK.CLASS2;
quit;[/code:a532b]
而我觉得上面那段写的太烂了,想想有没有更高效的。
但是下面的程序始终有语法错误,我觉得逻辑对了。
[code:a532b]proc sql noprint;
        create table WORK.CLASS like SASHELP.CLASS;
        insert into WORK.CLASS select * from (select * from SASHELP.CLASS where WEIGHT>=100 order by DESCENDING AGE);
        insert into WORK.CLASS select * from (select * from SASHELP.CLASS where WEIGHT<100 order by DESCENDING AGE);
quit;[/code:a532b]
请大家帮我看看。
作者: shiyiming    时间: 2004-10-8 17:04
标题: ...
[code:1e450]
proc sql ;
create table WORK.CLASS as
        select * from SASHELP.CLASS where WEIGHT>=112
        union
   select * from SASHELP.CLASS where WEIGHT<112
        order by age desc;
quit;[/code:1e450]
作者: shiyiming    时间: 2004-10-8 18:38
标题: Re: ...
willow大牛,谢谢! <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->

我脑子短路了,竟然没有想到union,惭愧啊,嘻嘻嘻。 <!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
作者: shiyiming    时间: 2004-10-8 18:56
标题: ...
客气,客气
作者: shiyiming    时间: 2004-10-10 16:03
标题: Re: ...
[quote=&quot;willon&quot;:16a85][code:16a85]
proc sql ;
create table WORK&#46;CLASS as
        select * from SASHELP&#46;CLASS where WEIGHT&gt;=112
        union
   select * from SASHELP&#46;CLASS where WEIGHT&lt;112
        order by age desc;
quit;[/code:16a85][/quote:16a85]
程序会不会只对后面一个SQL排序?即只对WEIGHT&lt;112 排序.
作者: shiyiming    时间: 2004-10-10 16:29
标题: to willon
willon,的确有点问题:
Robert这个人被排在体重轻的那组了。

似乎结果集仅仅按照了年龄排序,没有分组的概念。
作者: shiyiming    时间: 2004-10-12 00:33
标题: 。。。
如果我没有理解错的话,我打个比方:
create table tem as
select * from sashelp.class
order by age desc;

这段语句的意思是:
我要建一个表tem,内容是select * from sashelp.class,表tem以age字段倒序排序。
这里可能有个误会:是将select * from sashelp.class的内容放入tem中,然后表tem以age desc排序;而不是对select * from sashelp.class产生的内容进行age desc排序,然后将排序后的结果放入tem中。
order by是对create table 起作用的,order by的信息最终也依赖于保存在产生的新表中;select查询结果不能保存order by的信息,所以在用insert into的时候用order by会有语法错误。我上面程序中的order by也是对create table起作用的,不是对第二个查询起作用。

我是这样想的,如果错误,请指正。置于解决问题,只能先靠建临时表了,别的我再查查看。
作者: shiyiming    时间: 2004-10-12 01:03
标题: 。。。
我说的是sas,别的database不管。

SQLServer就可以实现。

[code:1b48b]use tempdb;
if object_id&#40;'tem'&#41; is not null
   drop table tem;

select top 0 * into tem  from pubs&#46;&#46;sales;

insert into tem select * from pubs&#46;&#46;sales where qty&gt;20  order by stor_id;

insert into tem select * from pubs&#46;&#46;sales where qty&lt;=20 order by stor_id desc;[/code:1b48b]
作者: shiyiming    时间: 2004-10-13 10:54
标题: Re: SQL语法请教
第一次发贴先拿版主你开刀
data sashelp.class;
set sashelp.class ;
hehe=(weight&gt;=100)*1000+age;
run;
proc sort;
by descending hehe;
run;

结果如下面
                                 id             age     weight   hehe
                                11             74     120.0    1074
                                12             74     103.0    1074
                                13             73     105.0    1073
                                14             73     102.0    1073
                                15             73     102.0    1073
                                16             72     110.0    1072
                                17             72     106.0    1072
                                18             72     102.0    1072
                                19             72     101.0    1072
                                20             71     110.5    1071
                                21             71     110.0    1071
                                22             51     108.0    1051
                                23             47     108.0    1047
                                24             40     105.5    1040
                                25             94      79.0      94
                                26             93      71.0      93
                                27             93      60.0      93
                                28             92      67.0      92
                                29             92      57.0      92
                                30             91      71.0      91
                                31             91      70.0      91
                                32             91      70.0      91
                                33             91      65.0      91
                                34             90      75.0      90
                                35             90      73.0      90
                                36             90      69.0      90
                                37             90      68.0      90
                                38             90      58.0      90
作者: shiyiming    时间: 2004-11-3 08:03
标题: 改进一下
你既然加了一个hehe字段,何不简单明了一点:
data tmp;
      set sashelp.class ;
      if weight &gt;=100 then flag=1;
      else flag=2;
run;
proc sort data=tmp;
by flag descending age;
run;
作者: shiyiming    时间: 2004-11-3 09:05
标题: 呵呵呵 :oops:
明了你到是算
简洁可能还是算我的吧
呵呵呵 <!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
作者: shiyiming    时间: 2004-11-25 13:32
标题: 简单的方法
proc sql ;
create table WORK.CLASS as
    select * from SASHELP.CLASS where WEIGHT&gt;=112 order by age desc
   union
   select * from SASHELP.CLASS where WEIGHT&lt;112  order by age desc;
quit;
作者: shiyiming    时间: 2004-11-27 05:57
标题: a more simple way to do it
proc sql noprint;
   create table CLASS0 as
   select * from SASHELP.CLASS
   order by WEIGHT&gt;=100 desc, age desc;
quit;
作者: shiyiming    时间: 2004-12-1 14:40
标题: 加个组别识别的字段就可以了
proc sql ;
create table WORK.CLASS as
    select *,1 as team from SASHELP.CLASS where WEIGHT&gt;=112
   union
   select * ,2 as team from SASHELP.CLASS where WEIGHT&lt;112
   order by team,age desc;
quit;
作者: shiyiming    时间: 2012-7-22 23:15
标题: Re: SQL语法请教
Mark




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