发出创build一个SSAS维度,该维度需要总帐期间并将其映射到date值
需求
我们希望在SSAS中创build一个“Smart Period”维度,该维度包含一个总账期间并将其映射到一个date值,以便我们可以在Excel中按期间查询我们的数据时使用date分析function。
以下文章讨论如何从不包含具有自然date的简单date时间戳的logging的数据集创build自定义(&财政)日历。
http://www.sqlservercentral.com/articles/Analysis+Services+(SSAS)/71140/ https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f1a94192-6eb1-4633-a56c-3c90c826584f/ssas-ytd-issue-fiscal-vs-calendar?forum=sqlanalysisservices http://www.sql-server-performance.com/2014/creating-financial-year-dimension-using-ssa
数据支持新的维度
我们面临的挑战是我们的交易盖有总账期(如2016年至2016年14年) – 所以在一个财政年度中有超过12个期间。 我们还希望在同一个数据集上提供日历视图(1月至12月)和财务视图(4月至3月)。 用户希望GL期间201612和201613可报告,但通常在201612一个财政期间呈现。
我们的基础数据库表被称为tbl.SmartPeriod,我在这个问题的最后包含了SQL来创build这个表,它的设置如下:
SmartDataKey – 此栏中显示的值显示组织中的总帐(GL)期间,包括201500,201513和201514期间用于会计目的。
FullServiceDateAlternativeKey – 此date值对应于我们要将GL期间映射到的财政年度中的月份。
AriesStylePeriod – 我们组织内的企业资源规划系统(ERP)称为ARIES,隐藏用于会计目的的GL期间。 通过将GL期间映射到ERP中保存的财政期间,一般用户在查看ERP上的交易数据时可以看到,我们将允许分析与他们对于我们数据的观点相符的SSAS。
SSAS维度
我们已经将这些数据映射到SSAS中称为Smart Period的维度,以下屏幕快照提供了其configuration的高级概述。
问题
我们希望使用Excel中的datefilter来过滤ARIES期间值,到目前为止,我们的工作导致在查看Months或Quarters时成功地使filter工作。 但是,在Excel中应用“年份”filter时,我们会从“智能期间”表中获取“日历年”中的值(例如,上一财年的第四季度以及本财年的前三季度,而不是当前财务的四分之三年)。
我们不能发布此function,直到我们可以在Excel中获得“年份filter”映射到会计年度,以便我们要求的三个datefilter(例如月,季度和年份)都正常工作。 目前我们只能得到月份和季度filter来映射到正确的期间值。
如果这将有助于解决scheme,我们愿意放弃日历年要求并从智能期间维度中删除对其的任何引用,因为此function仅由一小部分用户需要。
SQL来生成智能期数据表
/* This SQL generates a table that will hold the GL and Fiscal periods in a hierarchy that support the operation of a Smart Period dimension in SSAS */ /* Create the Smart Period Table --USE [CubeCreationSupport] --GO --/****** Object: Table [dbo].[tblSmartPeriod] Script Date: 04/11/2016 12:05:23 ******/ --SET ANSI_NULLS ON --GO --SET QUOTED_IDENTIFIER ON --GO --CREATE TABLE [dbo].[tblSmartPeriod]( -- [SmartDateKey] [int] NOT NULL, -- [FullSmartDateAlternateKey] [date] NOT NULL, -- [ARIESStylePeriod] [int] NOT NULL, -- [MonthName] [nvarchar](10) NOT NULL, -- [MonthNumberOfYear] [tinyint] NOT NULL, -- [CalendarQuarter] [tinyint] NOT NULL, -- [CalendarYear] [smallint] NOT NULL, -- [FiscalPeriod] [tinyint] NOT NULL, -- [FiscalQuarter] [tinyint] NOT NULL, -- [FiscalYear] [smallint] NOT NULL, -- [FiscalSemester] [tinyint] NOT NULL, -- CONSTRAINT [PK_DimDate_SmartDateKey] PRIMARY KEY CLUSTERED --( -- [SmartDateKey] ASC --)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], -- CONSTRAINT [AK_DimDate_FullSmartDateAlternateKey] UNIQUE NONCLUSTERED --( -- [FullSmartDateAlternateKey] ASC --)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] --) ON [PRIMARY] --GO --*/ DECLARE @ct INT DECLARE @InputDate DATETIME DECLARE @FinYear INT DECLARE @CalYear INT DECLARE @FYPeriods TABLE (SmartDateKey INT, FullSmartDateAlternateKey DATE, ARIESStylePeriod INT, EnglishMonthName Varchar(20), MonthNumberOfYear INT, CalendarQuarter INT , CalendarYear INT, FiscalPeriod INT, FiscalQuarter INT, FiscalYear INT, FiscalSemester INT) -- Choose INT or VARCHAR(6), no need to modify code DECLARE @YearCount INT SET @InputDate = '1971-04-01' SET @FinYear = (SELECT CASE WHEN DATEPART(MONTH,@InputDate) > 3 THEN DATEPART(YEAR, @InputDate) ELSE DATEPART(YEAR, @InputDate) - 1 END) SET @CalYear = DATEPART(YEAR, @InputDate) -- - 1 SET @YearCount = 0; WHILE @YearCount < 81 BEGIN SET @ct = 0; WHILE @ct < 1 BEGIN INSERT @FYPeriods SELECT CONVERT(VARCHAR,@FinYear) + '0' + CONVERT(VARCHAR,@ct) -- DateKey ,CONVERT(DATE,CONVERT(VARCHAR,@FinYear)+'-04-01') -- FullDateAlternateKey ,CONVERT(VARCHAR,@CalYear) + '0' + CONVERT(VARCHAR,@ct+1) -- ARIESStyle Period ,LEFT(DATENAME(MONTH, CONVERT(DATE,CONVERT(VARCHAR,@FinYear)+'-04-01')),3) -- MonthName ,4 -- MonthNumberOfYear ,2 -- CalendarQuarter ,@CalYear -- CalendarYear ,1 -- FiscalPeriod ,1 -- FiscalQuarter ,@FinYear -- FiscalYear ,1 -- FiscalSemester SET @ct = @ct + 1; END; WHILE @ct < 10 BEGIN INSERT @FYPeriods SELECT CONVERT(VARCHAR,@FinYear) + '0' + CONVERT(VARCHAR,@ct) -- ,CONVERT(DATE,CONVERT(VARCHAR,@FinYear)+'-'+CONVERT(VARCHAR,@ct+3)+'-02') ,CONVERT(DATE,CONVERT(VARCHAR,@CalYear)+'-'+CONVERT(VARCHAR,@ct+3)+'-02') ,CONVERT(VARCHAR,@FinYear) + '0' + CONVERT(VARCHAR,@ct) ,LEFT(DATENAME(MONTH, CONVERT(DATE,CONVERT(VARCHAR,@FinYear)+'-'+CONVERT(VARCHAR,@ct+3)+'-02')),3) ,CONVERT(VARCHAR,@ct+3) ,CASE WHEN (@ct/3.0) <= 1.0 THEN 2 WHEN (@ct/3.0) <= 2.0 THEN 3 ELSE 4 END ,@CalYear ,@ct ,CASE WHEN @ct < 4 THEN 1 WHEN @ct < 7 THEN 2 ELSE 3 END ,@FinYear ,1 SET @ct = @ct + 1; END; -- @ct = 10 WHILE @ct <= 12 BEGIN INSERT @FYPeriods SELECT CONVERT(VARCHAR,@FinYear) + CONVERT(VARCHAR(2),@ct) -- ,CONVERT(DATE,CONVERT(VARCHAR,@FinYear+1)+'-'+CONVERT(VARCHAR,@ct-9)+'-02') ,CONVERT(DATE,CONVERT(VARCHAR,@CalYear+1)+'-'+CONVERT(VARCHAR,@ct-9)+'-02') ,CONVERT(VARCHAR,@FinYear) + CONVERT(VARCHAR,@ct) ,LEFT(DATENAME(MONTH, CONVERT(DATE,CONVERT(VARCHAR,@FinYear)+'-'+CONVERT(VARCHAR,@ct-9)+'-02')) ,3) ,@ct-9 ,1 ,@CalYear+1 -- @FinYear + 1 ,@ct ,4 ,@FinYear ,2 SET @ct = @ct + 1; END; WHILE @ct <= 14 BEGIN INSERT @FYPeriods SELECT CONVERT(VARCHAR,@FinYear) + CONVERT(VARCHAR(2),@ct) -- ,CONVERT(DATE,CONVERT(VARCHAR,@FinYear+1)+'-03-0'+CONVERT(VARCHAR,@ct-10)) ,CONVERT(DATE,CONVERT(VARCHAR,@CalYear+1)+'-03-0'+CONVERT(VARCHAR,@ct-10)) ,CONVERT(VARCHAR,@FinYear) + CONVERT(VARCHAR,12) ,LEFT(DATENAME(MONTH,CONVERT(DATE,CONVERT(VARCHAR,@FinYear)+'-03-0'+CONVERT(VARCHAR,@ct-10))),3) ,3 ,1 ,@CalYear+1 -- @FinYear+1 ,12 ,4 ,@FinYear ,2 SET @ct = @ct + 1; END; SET @FinYear = @FinYear +1; SET @CalYear = @CalYear +1; SET @YearCount = @YearCount +1; END; --Select * From @FYPeriods Delete FROM dbo.tblSmartPeriod INSERT INTO dbo.tblSmartPeriod ([SmartDateKey],[FullSmartDateAlternateKey],[ARIESStylePeriod],[MonthName],[MonthNumberOfYear],[CalendarQuarter],[CalendarYear],[FiscalPeriod],[FiscalQuarter],[FiscalYear],[FiscalSemester]) SELECT [SmartDateKey],[FullSmartDateAlternateKey],[ARIESStylePeriod],[EnglishMonthName],[MonthNumberOfYear],[CalendarQuarter],[CalendarYear],[FiscalPeriod],[FiscalQuarter],[FiscalYear],[FiscalSemester] FROM @FYPeriods Select * From dbo.tblSmartPeriod