Formatting SAS行/列未显示(表格式问题)

Formatting SAS行/列未显示(表格式问题),formatting,sas,format,Formatting,Sas,Format,我有一个数据表,列有:年、月、销售额。它实际上是一个汇总表,就像excel中的透视表一样 使用此表,如果一个月内没有报告任何销售(即不是0销售,但没有提及销售,因此SAS无法确定某个月的值),则整行将消失 我不希望发生这种情况,而是希望该行显示0,而不是不显示。是否有办法更改此文件的格式以确保每一行都显示出来 注:月份不是日历月,因此您可以将60个月与2011年相关。如果使用proc summary或proc means创建表格,如果您的数据中每个月至少有一行,则实现所需输出类型的一种方法是使用

我有一个数据表,列有:年、月、销售额。它实际上是一个汇总表,就像excel中的透视表一样

使用此表,如果一个月内没有报告任何销售(即不是0销售,但没有提及销售,因此SAS无法确定某个月的值),则整行将消失

我不希望发生这种情况,而是希望该行显示0,而不是不显示。是否有办法更改此文件的格式以确保每一行都显示出来


注:月份不是日历月,因此您可以将60个月与2011年相关。

如果使用
proc summary
proc means
创建表格,如果您的数据中每个月至少有一行,则实现所需输出类型的一种方法是使用
completetypes
选项,例如

proc summary data = sashelp.class completetypes;
 class sex age;
 var weight;
 output out = mysummary mean=;
run;
data myclassdata;
  do SEX = 'M','F';
    do AGE = 13 to 17;
      output;
    end;
  end;
run;

proc summary nway data = sashelp.class classdata=myclassdata exclusive;
 class sex age;
 var weight;
 output out = mysummary2 mean=;
run;
这将为Sex=F、Age=16生成频率为0的行,而不是完全跳过该输出

一种更可靠但劳动强度更大的方法是使用
classdata
选项,即使某些值从未出现在数据中的任何位置,该方法仍然有效

proc summary data = sashelp.class completetypes;
 class sex age;
 var weight;
 output out = mysummary mean=;
run;
data myclassdata;
  do SEX = 'M','F';
    do AGE = 13 to 17;
      output;
    end;
  end;
run;

proc summary nway data = sashelp.class classdata=myclassdata exclusive;
 class sex age;
 var weight;
 output out = mysummary2 mean=;
run;

此处的
exclusive
选项将输出限制为
classdata
数据集中存在的级别组合。如果没有它,您至少会得到classdata中指定的那些,以及基于观察到的单向值的所有可能组合的行,就像您已经指定了
completetypes

,如果使用
proc summary
proc means
创建表,如果您的数据中每个月至少有一行,则实现所需输出类型的一种方法是使用
completetypes
选项,例如

proc summary data = sashelp.class completetypes;
 class sex age;
 var weight;
 output out = mysummary mean=;
run;
data myclassdata;
  do SEX = 'M','F';
    do AGE = 13 to 17;
      output;
    end;
  end;
run;

proc summary nway data = sashelp.class classdata=myclassdata exclusive;
 class sex age;
 var weight;
 output out = mysummary2 mean=;
run;
这将为Sex=F、Age=16生成频率为0的行,而不是完全跳过该输出

一种更可靠但劳动强度更大的方法是使用
classdata
选项,即使某些值从未出现在数据中的任何位置,该方法仍然有效

proc summary data = sashelp.class completetypes;
 class sex age;
 var weight;
 output out = mysummary mean=;
run;
data myclassdata;
  do SEX = 'M','F';
    do AGE = 13 to 17;
      output;
    end;
  end;
run;

proc summary nway data = sashelp.class classdata=myclassdata exclusive;
 class sex age;
 var weight;
 output out = mysummary2 mean=;
run;

此处的
exclusive
选项将输出限制为
classdata
数据集中存在的级别组合。如果没有它,您至少会得到classdata中指定的那些,以及基于观察到的单向值的所有可能组合的行,就像您指定了
completetypes

您能告诉我们该表是如何创建的吗?你需要描述在哪里可以找到或如何确定所有可能的月份。它来自一个大表,上面有每一笔销售的完成情况、销售日期和销售价值。然后按年份和月份对日期进行分组,统计销售额。因此,如果某个月没有销售,那么该月就不会出现在这个汇总表中(如上所述)。我能想到的唯一解决方案是添加0销售额的虚拟数据,这样每个月(和年)销售额都会下降,并迫使他们出现。超过12个月的原因是销售可能在2011年正式开始,但实际上在2016年完成,即60个月后。虽然我不确定这对提出解决方案是否有太大帮助,但您可以将销售开始日期和销售完成日期单独列出来,并可能分别对它们进行汇总。您能告诉我们该表是如何创建的吗?你需要描述在哪里可以找到或如何确定所有可能的月份。它来自一个大表,上面有每一笔销售的完成情况、销售日期和销售价值。然后按年份和月份对日期进行分组,统计销售额。因此,如果某个月没有销售,那么该月就不会出现在这个汇总表中(如上所述)。我能想到的唯一解决方案是添加0销售额的虚拟数据,这样每个月(和年)销售额都会下降,并迫使他们出现。超过12个月的原因是销售可能在2011年正式开始,但实际上在2016年完成,即60个月后。虽然我不确定这对提出解决方案是否有太大帮助,但听起来好像您可以使用单独的列来列出销售开始日期和销售完成日期,并可能分别对它们进行总结。我需要最后一种方法(因为它们从未实际出现在我的数据中)。但是,在开始时,用户可以定义宏变量(例如,%let ReportBasis=Year,然后通过代码的其余部分来防止手动更改代码),以确定他们是否希望按月、按年或按季度查看销售额。因此,这些宏变量将根据所选内容更改表的布局。第二个选项是否可以调整为更具动态性?宏变量在过程摘要中似乎不起作用。目前,它只是一个proc sql,它从大表中选择变量(其中一些是宏变量),然后对它们进行分组。如果使用正确,宏变量可以用来生成您喜欢的任何代码。如果你想寻求帮助,请用一个完整的可复制示例发布一个单独的问题你的程序摘要代码。我需要最后一种方法(在我的数据中从来没有出现过)。但是,在开始时,用户可以定义宏变量(例如,%let ReportBasis=Year,然后通过代码的其余部分来防止手动更改代码),以确定他们是否希望按月、按年或按季度查看销售额。因此,这些宏变量将根据所选内容更改表的布局。第二个选项是否可以调整为更具动态性?宏变量在过程摘要中似乎不起作用。目前,它只是一个proc sql,它从大表中选择变量(其中一些是宏变量),然后对它们进行分组。如果使用正确,宏变量可以用来生成您喜欢的任何代码。请发布一个单独的问题,并附上完整的可复制示例