楼主: moyunzheng
12646 10

[原创博文] sas sql中where 和having语句的区别 [推广有奖]

  • 1关注
  • 2粉丝

博士生

60%

还不是VIP/贵宾

-

威望
0
论坛币
1358 个
通用积分
0.0035
学术水平
18 点
热心指数
19 点
信用等级
17 点
经验
11986 点
帖子
240
精华
0
在线时间
360 小时
注册时间
2010-12-11
最后登录
2023-9-6

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
程序如下:data work.temp1;
input id $ sex $ jobcode $ salary birth date7.@@;
format birth mmddyy8.;
datalines;
1009 m ta1 28880 02mar59 1017 m ta3 40858 28dec57
1036 f ta3 39392 19may65 1037 f ta1 28558 10apr64
1038 f ta1 26533 09nov69 1050 m me2 35167 14jul63
1065 m me2 35090 26jan44 1076 m pt1 66558 14oct55
1094 m fa1 22268 02apr70 1100 m bck 25004 01dec60
;
run;
proc sql;
select jobcode,count(jobcode) as number,avg(int((today()-birth)/365.25)) as avgage,avg(salary) as avgsal
from work.temp1
where avgage ge 46
group by jobcode;
quit;
proc sql;
select jobcode,count(jobcode) as number,avg(int((today()-birth)/365.25)) as avgage,avg(salary) as avgsal
from work.temp1
group by jobcode
having avgage ge 46;
quit;


每一个sql出现以下错误:
        ERROR: The following columns were not found in the contributing tables: avgage.

问题:
         1.where与having的区别?
         2.是不是where 语句只能用于对数据集的单个观测进行条件限制,不能对多个观测结果进行条件限制,也就是说不能对上述的count()、avg()等计算多个观测得出的结果进行限制?
         3.要求计算的count()、avg()是分组后的结果,所以针对其计算结果只能的group后的having进行条件限制?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:having Where HERE sql AVI

沙发
碎浪 发表于 2011-5-5 21:40:56 |只看作者 |坛友微信交流群
2.是不是where 语句只能用于对数据集的单个观测进行条件限制,不能对多个观测结果进行条件限制,也就是说不能对上述的count()、avg()等计算多个观测得出的结果进行限制?
3.要求计算的count()、avg()是分组后的结果,所以针对其计算结果只能的group后的having进行条件限制?

一般的SQL语句中,2、3都是如您锁说的吧,统计结果不能用WHERE限定的

使用道具

藤椅
simen_wu 发表于 2011-5-5 22:30:58 |只看作者 |坛友微信交流群
感觉这是一个标准sql的问题,无论是where还是group by...having...都是针对原表的字段进行,因此会报错。
至于其他观点同意楼上

使用道具

板凳
456852 发表于 2011-5-6 03:40:36 |只看作者 |坛友微信交流群
你确定第二个sql会报错?我跑了一下,没错误啊。
where 和 having的区别在于group by。对汇总以后的变量加条件当然不能在分组以前就做啦。

使用道具

报纸
cjblovebj 发表于 2011-5-6 12:26:24 |只看作者 |坛友微信交流群
第二个SQL没报错啊!
尽最大努力,做最坏打算!

使用道具

地板
cjblovebj 发表于 2011-5-6 12:36:10 |只看作者 |坛友微信交流群
试了一下,where是对原数据的选择,having可以对分组后的进行选择~~ 3# simen_wu
已有 2 人评分学术水平 热心指数 收起 理由
四叶草 + 3 + 3 精彩帖子
mandyfervor + 1 分析的有道理

总评分: 学术水平 + 3  热心指数 + 4   查看全部评分

尽最大努力,做最坏打算!

使用道具

7
moyunzheng 发表于 2011-5-6 14:39:59 |只看作者 |坛友微信交流群
没有,就是第一个sql出现错误,第二个没有错

4# 456852

使用道具

8
Joyceding 发表于 2013-11-18 12:05:24 |只看作者 |坛友微信交流群
如果是原表的字段来限制, 两者好像都一样

使用道具

9
finalpluto 学生认证  发表于 2015-3-11 00:08:00 |只看作者 |坛友微信交流群
WHERE is processed before SELECT, so in the first sql SAS can not identify the column name AVGAGE. We can use:

where avg(int((today()-birth)/365.25)) ge 46
已有 1 人评分学术水平 收起 理由
四叶草 + 3 精彩帖子

总评分: 学术水平 + 3   查看全部评分

使用道具

10
michaelxiagang 发表于 2015-3-11 05:10:57 |只看作者 |坛友微信交流群
learned. thanks for sharing

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 02:26