2014-02-19 121 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