2014-02-19 116 views
0

我在excel中將數據集作爲空間使用,並且在數據中使用了&。我想做一些基於商店和家庭的報告和圖表,但客戶想保留商店名稱。例如:taba & wv,sup頂部。我怎樣才能通過商店這種名稱添加MACRO來生成表格以及如何使用宏生成報告,如PROC REPORT,PROC TABULATE和CHARTS。請在下面找到在SAS中生成報告的宏

Shop Year Month  Family Value1 Value2 Value3 
raoas 2006 january TA12  5  6  0 
taba&wv 2008 january TS01  0  1  1 
sup top 2008 april  TZ05  0  0  1 
taba&wv 2006 December TA12  5  6  0 
raoas 2008 january TA15  0  2  0 
sup top 2008 april  TQ05  0  1  1 

樣本數據我想創建的表應該看起來像

taba&wv 
Year Family sum_value1 Sumvalue2 Sum_value3 

sup top 
Year Family sum_value1 Sumvalue2 Sum_value3 

raoas 
Year Family sum_value1 Sumvalue2 Sum_value3 

回答

2

如果你只想爲不同的商店分別報告(所以不需要命名數據集或變量與商店名稱),那麼你會沒事的只是掩蓋正確的店鋪標題。這裏有,例如,每個店鋪建立PROC以表格形式列出:

data have; 
    infile datalines dsd dlm=','; 
    input Shop $ Year Month $ Family $ Value1 Value2 Value3 ; 
    datalines; 
raoas,2006,january,TA12,5,6,0 
taba&wv,2008,january,TS01,0,1,1 
sup top,2008,april,TZ05,0,0,1 
taba&wv,2006,December,TA12,5,6,0 
raoas,2008,january,TA15,0,2,0 
sup top,2008,april,TQ05,0,1,1 
;run; 

proc sql noprint; 
    select distinct shop into :shops separated by '|' 
    from have; 
quit; 

%macro reports; 
    %do i=1 %to %sysfunc(countw(%superq(shops),|)); 
     title "PROC TABULATE for %qscan(%superq(shops),&i,|)"; 
     proc tabulate data=have(where=(shop="%qscan(%superq(shops),&i,|)")); 
      class year month family; 
      var value:; 
      table year*month*family 
        , 
        (value1 value2 value3)*sum; 
     run; 
    %end; 
%mend reports; 
%reports 

%SUPERQ()不讓宏編譯器來嘗試解決taba&wv爲macrovariable,並%QSCAN()以及掩蓋&和空白同時掃描的名稱。

注意:作爲%SUPERQ()函數中的參數的宏變量必須爲WITHOUT &

+0

Wow按我的要求工作。我怎麼做輸出作爲單獨的表和圖表? – user2784588

1

&在一個名字將創建一個問題。這是不允許的SAS名稱。此外,如果不與VALIDVARNAME=ANY一起操作,該空間將成爲問題。我會在開始時將兩者都轉換爲_

%macro create_tables(input,output); 
data temp; 
set &input; 
Shop = translate(shop,'__','& '); 
run; 

%local n i; 
proc sql noprint; 
select count(distinct shop) 
    into :n 
    from temp; 

%do i=1 %to &n; 
    %local v&i; 
%end; 

select distinct shop 
    into :v1 - :v%left(&n) 
    from temp; 

%do i=1 %to &n 
create table &&v&i as 
select shop, 
     Family, 
     sum(Value1) as sum_value1, 
     sum(Value2) as sum_value2, 
     sum(Value3) as sum_value3 
    from temp 
    where shop = "&&v&i" 
    group by shop, family; 
%end; 
%quit; 
%mend; 

它使用PROC SQL來獲取不同的商店變成了一系列的宏觀變量& V1的 - & VN。然後,它使用SQL來查詢執行值的總和的大表。

+0

它沒有工作,沒有輸出結果表。 TRANSALATE可能是我們錯了嗎? – user2784588

+0

臨時表中有什麼?您可能需要稍微更改代碼以匹配您的表格。 – DomPazz