在本文的第一部分中,我们介绍了一些将用户控制的配置值放入多维数据集的方法,这样就可以通过更改表中的值来更改值。(我本可以很容易地把这些称为“数据驱动的解决方案”,但我觉得这个词现在被滥用了。)如果需求允许的话,前面概述的所有方法都可以满足需求,但是最终,需求将超过设计的能力,您将需要进行一些返工。
为了给我们的需求增加一些复杂性,业务用户传递了以下信息:
在本系列的第4部分(也是最后一部分)中,我们将通过引入一些奇特的T-SQL来满足上述所有要求。我们在最后一个解决方案中使用了PIVOT子句。这一个将添加引导窗口功能。
第3部分中概述的方法在一定程度上是可行的,但是如果单个值发生了更改,它将一直更改它。那达不到我们的新要求。更详细地解释一下:我们需要的是一种输入起始(默认)值(#1),然后输入任何新值的方法。此外,懒惰的业务用户只希望将新值放入一次,并将该值作为“新默认值”,直到再次更改为止保持有效(#2)。第3条说他们想要一种方法,本质上是将生效日期向前或向后滑动。他们还想要一种恢复到默认值的方法,不管默认值是什么,甚至不知道原始默认值(#4)。最后,他们想要的是财政周级别,而不是日期或日期级别(#5)。
如果您在第2部分中没有看到它,我们将使用一个配置表和一个缩写的日期维度表:


接下来,我们需要一个覆盖表,它将日期键和配置ID连接起来,如下所示:

对于任何表格,我们都需要一些样本数据:

请注意,我在每周财政中只插入了一天,而实际上应该是7天。
在第2部分中,我们将把这两个值添加到主配置表中:

现在向override表添加两个覆盖值

对于上面的示例覆盖值,我有意交错了ID的1和2之间的覆盖,这样它们就不会在同一周发生。
为了将所有内容整合在一起,我们将一次构建一个视图。以使用LEAD函数的SELECT语句开始,如下所示:

在上面的查询中,[EndWeek]列表示基于" PARTITION BY ConfigurationID "语句的特定[ConfigurationID]的下一个覆盖值的[FiscalWeekKey]。如果[EndWeek]的值恰好为空,这意味着这是该配置ID的最后一个按时间顺序排列的条目。
我们还需要dimDate表中不同的财政周的列表:

最后,用各自的公共表表达式包装上述两条语句,我们将把它们放在一起。与前面一样,WEEKS和Configuration视图之间的交叉连接产生了WEEKS和Configurations的笛卡尔积。在我们的例子中,10周和2个配置生成20行。但是还要注意[OVR]表的左外连接的ON子句:我们在[Configuration ID]上做了一个相等的连接(这并不奇怪),接下来的两行确保覆盖值被连接到正确的财政周。如果一个特定的覆盖值有4个星期有效,那么连接中的这两个和行将确保它发生。

还要注意第一个ISNULL(,)函数在行缺少覆盖值时获得默认值。要查看实际操作,请将以下行添加到cubeconfigationtable中,并重新运行SELECT语句。

注意,从201348周开始,配置ID 2(“我的浮动配置”)恢复到默认的1.2345
最后,我们需要通过在末尾添加适当的T-SQL子句来转移整个混乱:
现在,通过向覆盖表添加额外的条目,用户可以指定新值何时生效。添加条目后,当条目生效时,对其FiscalWeekKey的编辑将发生变化。
回顾:
利用现有的日期维度表,并为默认值和覆盖配置值添加两个简单表,我们就有了一个满足所有需求的视图。此外,要滑动任何一个配置覆盖的生效日期,只需简单地编辑它生效的星期。它将一直有效,直到它被另一个条目再次覆盖。
要向多维数据集添加第三个配置值,需要执行以下操作: