楼主: 滞点
4453 9

[有偿编程] SAS中如何对规律命名的多列求和? [推广有奖]

  • 1关注
  • 0粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
5993 个
通用积分
5.8500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
101 点
帖子
115
精华
0
在线时间
643 小时
注册时间
2015-7-27
最后登录
2025-7-28

楼主
滞点 发表于 2018-3-28 23:39:53 |AI写论文
20论坛币
SAS中如何对规律命名的多列求和?
有看到某乎有篇些的可解决,代码如下:但运行时总提示   WARNING: 没有解析符号引用 NUMER。

不知道问题出在哪里, total_total_50.xlsx (75.94 KB)
想做的就是对于规律命名的列(A1 A2 A3 B3 B4)分组求和。
感谢帮忙
  1. proc sql;
  2. select name into :numer separated by '+'
  3. from dictionary.columns
  4. where libname = 'WORK'
  5. and memname = 'A'
  6. and lower(substr(name,1,1)) = 'b'
  7. and not notdigit(substr(name,2));
  8. quit;
  9. proc sql;
  10. select a, sum(&numer) as sumb
  11. from a
  12. group by a;
  13. quit;
复制代码

关键词:Dictionary proc sql separate libname columns

沙发
abc630110845 发表于 2018-3-29 00:02:33
没有事先声明宏变量,如果你这一段code是在一个宏里面,可以在宏开始的时候加%LOCAL NUMER;如果不是在宏里面,可以在前面加一句%GLOBAL NUMER
已有 1 人评分论坛币 收起 理由
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

藤椅
滞点 发表于 2018-3-29 00:14:38
abc630110845 发表于 2018-3-29 00:02
没有事先声明宏变量,如果你这一段code是在一个宏里面,可以在宏开始的时候加%LOCAL NUMER;如果不是在宏里 ...
感谢您的回复,现在可调用宏了,但宏部分运行起来总说我没有选择任何行,修改相应部分也没用。。

附上某乎网址:https://www.zhihu.com/question/43874500

感谢您的帮助

板凳
abc630110845 发表于 2018-3-29 00:23:29
滞点 发表于 2018-3-29 00:14
感谢您的回复,现在可调用宏了,但宏部分运行起来总说我没有选择任何行,修改相应部分也没用。。

附上 ...
你Work逻辑库下面的数据集A应该不存在,把你生成数据集A的那段code跑一下就可以了

报纸
滞点 发表于 2018-3-29 08:28:52
abc630110845 发表于 2018-3-29 00:23
你Work逻辑库下面的数据集A应该不存在,把你生成数据集A的那段code跑一下就可以了
检查后改数据集是存在的。。。


1018  proc sql noprint;
1019  select name into :numer separated by '+'
1020  from dictionary.columns
1021  where libname = 'WORK'
1022  and memname = 'total_total_50'
1023  and lower(substr(name,1,1)) = 'T'
1024  and not notdigit(substr(name,.));
NOTE: 没有选择任何行。
1025  quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.03 秒


1026  %GLOBAL NUMER;

地板
abc630110845 发表于 2018-3-29 10:52:39
滞点 发表于 2018-3-29 08:28
检查后改数据集是存在的。。。
你跑这段SQL之前要先在work逻辑库里面生成数据集A啊,要么你的数据集A是空的?

7
滞点 发表于 2018-3-29 12:40:23
abc630110845 发表于 2018-3-29 10:52
你跑这段SQL之前要先在work逻辑库里面生成数据集A啊,要么你的数据集A是空的?
不啊,数据集都是完整的,没有问题的~

8
abc630110845 发表于 2018-3-29 13:48:57
滞点 发表于 2018-3-29 12:40
不啊,数据集都是完整的,没有问题的~
那就可能是数据集total_total_50里面没有能够满足你的那么多条件的观测,你看跑出来的数据集test是不是空的

proc sql noprint;
create table test as
select *
from dictionary.columns
where libname = 'WORK'
and memname = 'total_total_50'
and lower(substr(name,1,1)) = 'T'
and not notdigit(substr(name,.));
quit;
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

9
滞点 发表于 2018-3-29 14:57:33
abc630110845 发表于 2018-3-29 13:48
那就可能是数据集total_total_50里面没有能够满足你的那么多条件的观测,你看跑出来的数据集test是不是空 ...
果然是空值,但奇怪的是数据集内是有满足我条件的观测,您可以看下我上传的附件,感谢您帮忙

10
abc630110845 发表于 2018-3-29 19:34:36
滞点 发表于 2018-3-29 14:57
果然是空值,但奇怪的是数据集内是有满足我条件的观测,您可以看下我上传的附件,感谢您帮忙
lower(substr(name,1,1)) = 'T',这句错了,你都用了lower函数,后面还跟大写,肯定是出不来结果的

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 20:46