楼主: tj0412ymy
2347 5

[问答] 请教高手如何在SAS SQL中实现这一操作? [推广有奖]

  • 2关注
  • 48粉丝

已卖:4314份资源

副教授

65%

还不是VIP/贵宾

-

威望
0
论坛币
11512 个
通用积分
12.7575
学术水平
72 点
热心指数
91 点
信用等级
64 点
经验
29292 点
帖子
545
精华
0
在线时间
1203 小时
注册时间
2009-3-10
最后登录
2024-2-15

楼主
tj0412ymy 发表于 2011-11-16 14:07:19 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

ID

A

B

C

D

Attr1

Atrr2

sku1

100

200

300

400

B

D

sku2

500

600

700

800

A

C

期望得到的结果:

ID

x

y

sku1

200

400

sku2

500

700





任务需求:对每一行,选出以Attr1Attr2的值 为列名的列。

目前这一操作已经在DATA步实现了,请教高手如何在SAS SQL中实现上面的操作?Many Thanks.
附DATA步的操作程序:

  1. data test;
  2. input ID $ A B C D Attr1 $ Attr2 $;
  3. cards;
  4. sku1 100 200 300 400 B D
  5. sku2 500 600 700 800 A C
  6. ;
  7. run;

  8. data test1;
  9. set test;
  10. array item a b c d;
  11. do i=1 to 4;
  12. if vname(item(i))=attr1 then do;
  13. x=item(i);
  14. end;
  15. if vname(item(i))=attr2 then do;
  16. y=item(i);
  17. end;
  18. end;
  19. drop i;
  20. run;
复制代码


二维码

扫码加我 拉你入群

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

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

关键词:请教高手 sql thanks data步 array 程序 400 如何

本帖被以下文库推荐

对SAS和统计方面感兴趣的朋友,请加SAS学习和认证讨论群:169157207。欢迎在群上讨论!

沙发
soporaeternus 发表于 2011-11-16 14:57:07
  1. proc sql;
  2.         create table b(drop=temp) as
  3.                 select
  4.                         id
  5.                         ,compress("|"||"A"||"|"||put(A,8.)||"|"||"B"||"|"||put(B,8.)||"|"||"C"||"|"||put(C,8.)||"|"||"D"||"|"||put(D,8.)) as temp
  6.                         ,input(scan(substr(calculated temp,index(calculated temp,compress("|"||attr1||"|"))),2,"|"),8.) as x
  7.                         ,input(scan(substr(calculated temp,index(calculated temp,compress("|"||attr2||"|"))),2,"|"),8.) as y

  8.         from
  9.                         a
  10.                 ;
  11. quit;
复制代码
我是纯粹来搞笑的......
一般还是
列传行保留列名-〉连接-〉行转列 比较靠谱,呵呵
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
tj0412ymy + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

Let them be hard, but never unjust

藤椅
tj0412ymy 发表于 2011-11-16 16:15:35
soporaeternus 发表于 2011-11-16 14:57
我是纯粹来搞笑的......
一般还是
列传行保留列名-〉连接-〉行转列 比较靠谱,呵呵
很不错的code,非常感谢!不过还是存在一定的问题的,因为实际数据库中不仅包括ABCD这四列,而是包括300列,按照该方法,temp字符串会很长很长。
对SAS和统计方面感兴趣的朋友,请加SAS学习和认证讨论群:169157207。欢迎在群上讨论!

板凳
soporaeternus 发表于 2011-11-16 16:16:52
tj0412ymy 发表于 2011-11-16 16:15
很不错的code,非常感谢!不过还是存在一定的问题的,因为实际数据库中不仅包括ABCD这四列,而是包括300列 ...
列传行做吧......
Let them be hard, but never unjust

报纸
bobguy 发表于 2011-12-4 07:01:10
soporaeternus 发表于 2011-11-16 14:57
我是纯粹来搞笑的......
一般还是
列传行保留列名-〉连接-〉行转列 比较靠谱,呵呵
Why not use a <case when end> recode statement in SQL?

data t1;
a=1;b=2;c=3;d=4;att1='a';att2='c';
run;

proc sql;
  select
  case att1
  when 'a' then a
  when 'b' then b
  when 'c' then c
  else          d
  end as att1v,
  case att2
  when 'a' then a
  when 'b' then b
  when 'c' then c
  else          d
  end as att1v
  from t1
  ;
  quit;

地板
soporaeternus 发表于 2011-12-5 08:51:28
bobguy 发表于 2011-12-4 07:01
Why not use a  recode statement in SQL?

data t1;
嗯!这是一个好的办法!而且参数化也很简单!学习了!
Let them be hard, but never unjust

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

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