SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 3330|回复: 14
打印 上一主题 下一主题

SQL语法请教

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-10-8 14:53:04 | 只看该作者

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]
请大家帮我看看。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-10-8 17:04:02 | 只看该作者

...

[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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-10-8 18:38:44 | 只看该作者

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: -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-10-8 18:56:50 | 只看该作者

...

客气,客气
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-10-10 16:03:43 | 只看该作者

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 排序.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2004-10-10 16:29:27 | 只看该作者

to willon

willon,的确有点问题:
Robert这个人被排在体重轻的那组了。

似乎结果集仅仅按照了年龄排序,没有分组的概念。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-10-12 00:33:29 | 只看该作者

。。。

如果我没有理解错的话,我打个比方:
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起作用的,不是对第二个查询起作用。

我是这样想的,如果错误,请指正。置于解决问题,只能先靠建临时表了,别的我再查查看。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2004-10-12 01:03:54 | 只看该作者

。。。

我说的是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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2004-10-13 10:54:32 | 只看该作者

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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2004-11-3 08:03:00 | 只看该作者

改进一下

你既然加了一个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;
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-4 00:32 , Processed in 0.074713 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表