太久沒(méi)有記錄了,上次差不多是半年前了。工作之后就太忙了牧抽,也抽不出時(shí)間來(lái)記錄谷炸。
現(xiàn)在就回來(lái)記錄一些吧,要學(xué)的有些雜畦徘,筆記也會(huì)記得很雜毕籽。
現(xiàn)在有一個(gè)任務(wù):有一個(gè)表cars,其中的make列有多個(gè)汽車(chē)品牌,現(xiàn)在依據(jù)不同的汽車(chē)品牌將表進(jìn)行拆分井辆,每個(gè)子表對(duì)應(yīng)一個(gè)類(lèi)型的汽車(chē)关筒。
教學(xué)書(shū)中的解法:
因?yàn)橐ǘ鄠€(gè)子表,所以用到了do循環(huán)杯缺,循環(huán)要用到數(shù)字1 to n蒸播,所以這里先將汽車(chē)品牌進(jìn)行映射
使用proc format的方式進(jìn)行映射,后面可以直接使用 put(&i , carname.)的方式取出對(duì)應(yīng)的品牌名萍肆。
接下來(lái)就是使用sas中的do循環(huán)來(lái)進(jìn)行循環(huán)建表了
和我想的一樣袍榆,建立一個(gè)宏函數(shù),在其中調(diào)用do循環(huán)和if判斷塘揣。
這種方法確實(shí)可行包雀,但其實(shí)有一個(gè)巨大的坑,那就是一開(kāi)始的映射亲铡,你三個(gè)汽車(chē)品牌可以自己挨個(gè)寫(xiě)才写,那如果有30個(gè)呢葡兑?如果有300個(gè)呢?
新的解法:
新的解法使用proc SQL與宏函數(shù)結(jié)合來(lái)解這個(gè)問(wèn)題(畢竟SQL寫(xiě)得習(xí)慣了)
首先獲得汽車(chē)的品牌列表
然后定義宏來(lái)拆分表格
這里解釋一下這個(gè)sysfunc(countw(&car_brands));這一行代碼
這個(gè)countw的作用就是以空格為分割符進(jìn)行計(jì)數(shù)赞草,因?yàn)樯厦娅@取列表的時(shí)候就是用空格進(jìn)行分割的讹堤。
而sysfunc的這個(gè)函數(shù)的意思是讓一些不是宏函數(shù)的函數(shù)再宏中也能發(fā)揮作用。
%let brand = %scan(&car_brands, &i);這行命令就是取出這個(gè)值