我不确定如何准确地表达这个问题。
本质上,假设我在不同的销售团队中有一群销售人员。比如,蓝色区域、橙色区域、红色区域等等。
现在,这些销售人员每个人都连接到一个销售区域,但有时可能会随着时间的推移而改变销售区域。
假设 Bob Jones 在 2015 年 1 月、2015 年 2 月、2015 年 3 月在蓝色区域,但在 2015 年 4 月,他去了绿色区域。
因此,我正在尝试创建一个报告,该报告将根据地区汇总销售收入(即使在技术层面,它已记录到销售人员)。
所以我们会有交易(表:employee_sales)数据如下:
name date sales
Bob Jones February 18th, 2015 $50,000
等等等等
因此,为了按地区聚合,我需要一个辅助维度表,如下所示(请记住,地区会随时间变化)(表:employee_region)
name region month year
Bob Jones Blue January 2015
Bob Jones Blue February 2015
Bob Jones Blue March 2015
Bob Jones Green April 2015
然后我可以简单地做一个查询:
select er.region, er.month, er.year, sum(es.sales)
from employee_sales es
inner join employee_region er
on es.name = er.name and month(es.date) = er.month and year(es.date) = er.year
group by er.region, er.month, er.year
所以这会给我我需要的数据。
但是,现在我遇到了一个问题 --- 假设我有 500 名员工并且 REGION 数据延迟一个月更新。所以现在,2016 年 2 月,我们只有 2016 年 1 月的地区数据。
我想做的是……当月(2016 年 2 月)……如果区域的“帮助表”中的数据在该月丢失,则取上次找到的月份(可能是一月,但有时甚至可能是 12 月或 11 月)。
我不确定在这里做什么。创建某种视图?
我是否重组“帮助表”,使其更像是一个不平等声明?
编辑:我认为这是一个缓慢变化的尺寸问题。嗯,我可能必须重新组织维度表。
我不会那样组织你的“帮助表”。我只会保留 {Region, Salesman, StartDate}。要创建间隔视图,请将该表与其自身连接以创建数据范围
where a.StartDate < b.StartDate
。使用外部联接,以便 NULL 表示“现在”的 EndDate,您可以根据需要将其与当前日期或其他日期合并。要表示离开(而不是重新分配),请使用名为CiaoBaby或类似名称的人工区域。现在您的维护工作变得容易多了;您只需要捕获人员配置变化。桌子变小了(随着时间的推移,100 或 1000 oodles)。你自然而然地有了一个内在的假设,即在没有相反信息的情况下,今天的推销员仍然依附于上个月的同一家推销员。
您不需要为此创建视图。View一般用来提高代码的性能。为此,您必须始终使用年和月的顺序找出当前月份的值。
在下面找到您的问题的解决方案: