程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SSAS:自定義的日期維度設計

SSAS:自定義的日期維度設計

編輯:關於SqlServer

SSAS Date 維度基本上在所有的 Cube 設計過程中都存在,很難見到沒有時間維度的 OLAP 數據庫。 但是根據不同的項目需求, Date 維度的設計可能不大相同,所以在設計時間維度的時候需要搞清楚幾 個問題:

你的業務涉及到的最低的細節級別是什麼?比如按季度查看報表還是按月份,或者按周,或者再甚者 按天。這個細節級別需要弄清楚,比如在一些銷售數據統計,有的時候可能更多按季度或者按月來查看 報表。但在有的監控一些機器運行數據的統計,可能會按照小時或者分鐘來查看報表。

你的報表所需要時間顯示的格式是什麼,比如在英文系統中客戶是希望顯示月份的全稱 January 或 者簡稱 Jan 或者只喜歡看到數字1,2,3 到12 這種類型。包括顯示具體天的時候是希望看到 10/1/2005 還是 2005/10/01 等格式。

還有沒有一些特別的時間信息比如不僅僅需要自然年,而且還需要財年信息,以及其它是否是閏年, 周末等這樣的要求。

最重要的一點是客戶喜歡按照哪一種或者哪幾種層次結構來查看報表,比如第一層是年,通過年導航 到月再導航到日期;還是說通過年直接導航到周再到具體的日期。

弄清楚上面這幾方面的內容之後,心裡大概知道時間屬性的范圍了,細到哪一種級別,由哪些特別的 字段需要添加都在這個設計階段完成。

一般情況下,可以自己寫一個創建時間日期的數據倉庫維度表,在這個腳本裡面可以根據需要自定義 一些特別的日期格式。

---------------------------------------------------------------------
-- BIWORK DimDate and vDimDate Demo
-- http://www.cnblogs.com/biwork 
----------------------------------------------------------------------
USE BIWORK_SSIS
GO  
SET NOCOUNT ON
    
IF OBJECT_ID('DimDate','U') IS NOT NULL
DROP TABLE DimDate
GO
    
CREATE TABLE DimDate
(
    DateKey INT PRIMARY KEY,
    FullDate DATE NOT NULL,
    [DateName] NVARCHAR(20),
    DayNumberOfWeek TINYINT NOT NULL,
    DayNameOfWeek NVARCHAR(10) NOT NULL,
    DayNumberOfMonth TINYINT NOT NULL,
    DayNumberOfYear SMALLINT NOT NULL,
    IsWeekend BIT NOT NULL,
    IsLeapYear BIT NOT NULL,
    WeekNumberOfYear TINYINT NOT NULL,
    EnglishMonthName NVARCHAR(10) NOT NULL,
    MonthNumberOfYear TINYINT NOT NULL,
    CalendarQuarter TINYINT NOT NULL,
    CalendarSemester TINYINT NOT NULL,
    CalendarYear SMALLINT NOT NULL, 
    FiscalQuarter TINYINT NOT NULL,
    FiscalSemester TINYINT NOT NULL,
    FiscalYear SMALLINT NOT NULL
)
    
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
    
SELECT @StartDate = '2005-01-01',
       @EndDate = '2013-12-31'
    
WHILE (@StartDate <= @EndDate)
BEGIN
    INSERT INTO DimDate 
    (
        DateKey,
        FullDate,
        [DateName],
        DayNumberOfWeek,
        DayNameOfWeek,
        DayNumberOfMonth,
        DayNumberOfYear,
        IsWeekend,
        IsLeapYear,
        WeekNumberOfYear,
        EnglishMonthName, 
        MonthNumberOfYear,
        CalendarQuarter,
        CalendarSemester,
        CalendarYear, 
        FiscalQuarter,
        FiscalSemester,
        FiscalYear 
    )
    SELECT CAST(CONVERT(VARCHAR(8),@StartDate,112) AS INT) AS DateKey,
           CONVERT(VARCHAR(10), @StartDate,20) AS FullDate,
           CONVERT(VARCHAR(20), @StartDate,106) AS [DateName],
           DATEPART(DW,@StartDate) AS DayNumberOfWeek,
           DATENAME(DW,@StartDate) AS DayNameOfWeek,
           DATENAME(DD,@StartDate) AS [DayOfMonth],
           DATENAME(DY,@StartDate) AS [DayOfYear],
           CASE WHEN DATEPART(DW,@StartDate) IN (1,7)  
                    THEN 1
                ELSE 0 
           END AS IsWeekend,
           CASE WHEN ((YEAR(@StartDate) % 4 = 0) AND (YEAR(@StartDate) % 100 != 0 OR YEAR

(@StartDate) % 400 = 0))
                    THEN 1
                ELSE 0
           END AS IsLeapYear,
           DATEPART(WW,@StartDate) AS WeekNumberOfYear,
           DATENAME(MM,@StartDate) AS EnglishMonthName,
           DATEPART(MM,@StartDate) AS MonthNumberOfYear,
           DATEPART(QQ,@StartDate) AS CalendarQuarter,
           CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
                    THEN 1
                ELSE 2
           END AS CalendarSemester,
           DATEPART(YY,@StartDate) AS CalendarYear, 
           CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
                     THEN DATEPART(QQ,@StartDate) + 2
                ELSE DATEPART(QQ,@StartDate) - 2
           END AS FiscalQuarter,
           CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
                    THEN 2
                ELSE 1
           END AS FiscalSemester,
           CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
                    THEN DATEPART(YY,@StartDate) 
                ELSE DATEPART(YY,@StartDate) + 1
           END AS FiscalYear
                
    SET @StartDate = @StartDate + 1
END
GO
    
---------------------------------------------------------------------
-- 加上視圖的作用是因為在實際的項目開發中,SSAS 的數據源視圖所有的表對象
-- 應該都引用視圖,這樣當數據倉庫中維度表或者事實表有小的改動就可以直接在
-- 視圖中修改,而可以避免修改 SSAS 項目。
-- 這一點在 SSIS 開發中同樣適用,所有在 SSIS 中配置的 SQL 語句都封裝在存儲
-- 過程中,表封裝在視圖中。邏輯的修改直接體現在存儲過程中,而不會修改 SSIS。
----------------------------------------------------------------------
IF OBJECT_ID('vDimDate','V') IS NOT NULL
DROP VIEW vDimDate
GO
    
CREATE VIEW vDimDate
AS
  -- 可以根據需要實現一些計算列,這些計算列通常也可以在 SSAS 視圖中添加。
SELECT DateKey AS 'DateKey',
       FullDate AS 'FullDate',
       [DateName] AS 'DateName',
       CONVERT(VARCHAR(2),DayNumberOfMonth) + ' ' + EnglishMonthName + ' ' + CONVERT(CHAR

(4), CalendarYear) AS 'FullDateName', -- 1 July 2005 
       DayNumberOfWeek AS 'DayNumberOfWeek',
       DayNameOfWeek AS 'DayNameOfWeek',
       DayNumberOfMonth AS 'DayNumberOfMonth',
       DayNumberOfYear AS 'DayNumberOfYear',
       CASE WHEN IsWeekend = 1 THEN 'Weekend'
            ELSE 'Weekday'
       END AS 'WeekdayWeekend',
       IsLeapYear AS 'IsLeapYear',
       WeekNumberOfYear AS 'WeekNumberOfYear',
       EnglishMonthName AS 'EnglishMonthName',
       EnglishMonthName + ' ' + CONVERT(CHAR(4),CalendarYear) AS 'MonthName',  -- July 2005
       CalendarYear * 100 + MonthNumberOfYear AS 'MonthKey', -- 200507
       MonthNumberOfYear AS 'MonthNumberOfYear',
       CalendarQuarter AS 'CalendarQuarter',
       CalendarSemester AS 'CalendarSemester',
       CalendarYear AS 'CalendarYear',  
       CalendarYear * 100 + CalendarQuarter AS 'CalendarQuarterKey',  -- 200503
       'CY ' + CONVERT(CHAR(4),CalendarYear) AS 'CalendarYearName', -- CY 2005
       'CY ' + CONVERT(CHAR(4),CalendarYear) 
             + ' Qtr '
             + CONVERT(CHAR(1), CalendarQuarter) AS 'CalendarQuarterName', -- CY 2005 Qtr 3 

 
       FiscalQuarter AS 'FiscalQuarter',
       FiscalSemester AS 'FiscalSemester',
       FiscalYear AS 'FiscalYear', 
       FiscalYear * 100 + FiscalQuarter AS 'FiscalQuarterKey', -- 200601
       'FY ' + CONVERT(CHAR(4), FiscalYear) AS 'FiscalYearName',  -- FY 2006
       'FY ' + CONVERT(Char(4), FiscalYear) + ' Qtr ' + Convert(Char(1), FiscalQuarter) AS 

'FiscalQuarterName' -- FY 2006 Qtr 1
FROM DimDate
GO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved