我有一个大型数据集(下面称为输入),其中包含各种信息,如销售日期,交易日期,付款,销售。
用户可以按年,季度或月份生成报告,以显示特定销售年度特定月份/季度/年度的付款金额。因此,您可以在首次销售后5年获得付款,即2016年与2011年销售年度相关的付款。
用户可以通过使用宏变量(即%let ReportBasis = Year)来决定是否希望在代码开头按月或季/年使用这些付款期,并通过其他方式调用ReportBasis没有手动调整的代码。
报告的制作使用:
proc sql;
create table report as
select sales_year, &ReportBasis, Sum(Sales) as Sales
from input
group by sales_year, &ReportBasis;
quit;
现在我遇到的问题是,如果在所讨论的所有销售年度的特定时期内没有付款,则该期间没有任何行。这会产生布局问题。
我需要一个解决方案,由于宏变量的性质(每年变化到一个季度),这可能是动态的。
所以我有这个(例子):
2011 Month 11 100
2011 Month 12 250
2011 Month 13 85
2011 Month 15 90
2011 Month 16 300
但我需要这个:
2011 Month 11 100
2011 Month 12 250
2011 Month 13 85
2011 Month 14 0
2011 Month 15 90
2011 Month 16 300
我所有数据(即使是其他2012年,2013年等)的第14个月都没有实际付款,因此它没有出现在我的第一张表中,但第二张表仍巧妙地知道包括它。
提前致谢。
答案 0 :(得分:1)
以下是一个假设所有年份和报告都以input
表示的解决方案,但不是所有组合:
create table report as
select sy.sales_year, r.rb, Sum(i.Sales) as Sales
from (select distinct sales_year from input) sy cross join
(select distinct &ReportBasis as rb from input) r left join
input i
on i.sales_year = sy.sales_year and i.&ReportBasis = r.&ReportBasis
group by sy.sales_year, r.rb;