FocusBI:地產分析&雪花模型

微信公衆號:FocusBI
關注可瞭解更多的商業智能、數據倉庫、數據庫開發、爬蟲知識及滬深股市數據推送。問題或建議,請關注公衆號發送消息留言;
若是你以爲FocusBI對你有幫助,歡迎轉發朋友圈或在文章末尾點贊[1]html

       

  《商業智能教程》pdf下載地址    數據庫

  連接:https://pan.baidu.com/s/1f9VdZUXztwylkOdFLbcmWw 密碼:2r4v微信

 

  在《租房分析&星型模型》中講了如何建立一個星型模型的SSAS項目方案,這裏我作一個雪花模型案例。雪花模型是在星型模型的基礎上進行修改。post

雪花模型

       雪花模型其實就是把多個表合成一個維度,有減小數據沉餘的做用,也易於維護和屬性擴展,這裏使用地產數據舉例, 維度有 房間、樓棟、項目、區域、日期,其實房間、樓棟、項目、區域這些數據都是包含關係,如 房間的上一級是樓棟、樓棟的上一級是項目、項目的上一級是區域,而事實數據簽約、認購、回款 是地產通用的三張表,也是明源ERP的核心。url

日期維度

       日期維度是任何項目都通用的維度,只要涉及到金額數量就會有按年-季-月、年-季-月-日、年-周、年天、月天、星期、旬等這些角度去看數據。那麼怎樣才能獲得某一天是屬於哪一年、哪一個季度、哪一個月、哪一個周、那一年的某天、哪一個旬、星期幾?這裏就用存儲過程來實現,雖然SSAS提供了智能日期維度,也對財務日期作了一些修改,可是它畢竟是美國人的思惟模式很難複合中國國情須要的日期,好比美國人一週的第一天是週日,而中國是週一。那麼怎麼來實現這個存儲過程,這個存儲過程能夠寫的比較長容易看懂若是對SQL 的日期處理比較熟悉的話只要幾行就能完成不容易看懂。這裏我就是用容易看懂的比較長的SQL語句來實現。htm

 

日期存儲過程

SETANSI_NULLSONblog

GO教程

SETQUOTED_IDENTIFIERONip

GO項目管理

-- =============================================

-- Author:       FocusBI

-- Create date: 20180824

-- Description:  完整的日期信息表

--=============================================

ALTERPROCEDURE [dbo].[Dim_Date]@BeginDate nvarchar(8), @EndDate nvarchar(8)

AS

BEGIN

   

        declare @DateKey int  

        declare @dtEndOfDay datetime 

        set @dtEndOfDay =convert(datetime,cast(@BeginDate asnvarchar),120)

        set @DateKey =convert(varchar,@dtEndOfDay,112)

 

        while @dtEndOfDay <convert(datetime,cast(@EndDate asnvarchar),120)

        begin

 

        select  @DateKey as DateKey,

                @dtEndOfDayasData,  

                YEAR(@dtEndOfDay)asYear,

                casewhenMonth(@dtEndOfDay)<= 6 then'上半年'

                     else'下半年'endas HalfAYear,  

                datepart(qq,@dtEndOfDay)as  Quarter_num, 

                casewhendatepart(qq,@dtEndOfDay)= 1 then'Q1'

                     whendatepart(qq,@dtEndOfDay)= 2 then'Q2'

                     whendatepart(qq,@dtEndOfDay)= 3 then'Q3'

                     else'Q4'   endas  Quarter_EN, 

       

                casewhendatepart(qq,@dtEndOfDay)= 1 then'一季度'

                     whendatepart(qq,@dtEndOfDay)= 1 then'二季度'

                     whendatepart(qq,@dtEndOfDay)= 1 then'三季度'

                     else'四季度'endas Quarter_CN,

 

                month(@dtEndOfDay)as Month_num,

                casewhenmonth(@dtEndOfDay)= 1 then'January'

                     whenmonth(@dtEndOfDay)= 2 then'February'

                     whenmonth(@dtEndOfDay)= 3 then'March'

                     whenmonth(@dtEndOfDay)= 4 then'April'

                     whenmonth(@dtEndOfDay)= 5 then'May'

                     whenmonth(@dtEndOfDay)= 6 then'June'

                     whenmonth(@dtEndOfDay)= 7 then'Jul'

                     whenmonth(@dtEndOfDay)= 8 then'August'

                     whenmonth(@dtEndOfDay)= 9 then'September'

                     whenmonth(@dtEndOfDay)= 10 then'October'

                     whenmonth(@dtEndOfDay)= 11 then'November'

                     else'December'end Month_EN ,

 

                casewhenmonth(@dtEndOfDay)= 1 then'Jan'

                     whenmonth(@dtEndOfDay)= 2 then'Feb'

                     whenmonth(@dtEndOfDay)= 3 then'Mar'

                     whenmonth(@dtEndOfDay)= 4 then'Apr'

                     whenmonth(@dtEndOfDay)= 5 then'May'

                     whenmonth(@dtEndOfDay)= 6 then'Jun'

                     whenmonth(@dtEndOfDay)= 7 then'Jul'

                     whenmonth(@dtEndOfDay)= 8 then'Aug'

                     whenmonth(@dtEndOfDay)= 9 then'Sep'

                     whenmonth(@dtEndOfDay)= 10 then'Oct'

                     whenmonth(@dtEndOfDay)= 11 then'Nov'

                     else'Dec'end Month_JX , 

 

                casewhenmonth(@dtEndOfDay)= 1 then'一月'

                     whenmonth(@dtEndOfDay)= 2 then'二月'

                     whenmonth(@dtEndOfDay)= 3 then'三月'

                     whenmonth(@dtEndOfDay)= 4 then'四月'

                     whenmonth(@dtEndOfDay)= 5 then'五月'

                     whenmonth(@dtEndOfDay)= 6 then'六月'

                     whenmonth(@dtEndOfDay)= 7 then'七月'

                     whenmonth(@dtEndOfDay)= 8 then'八月'

                     whenmonth(@dtEndOfDay)= 9 then'九月'

                     whenmonth(@dtEndOfDay)= 10 then'十月'

                     whenmonth(@dtEndOfDay)= 11 then'十一月'

                     else'十二月'end Month_CN ,  

 

                     day(@dtEndOfDay)as [Month_Day] ,

                     DATENAME(dy,@dtEndOfDay)as Year_Day,

                     DATENAME(wk,@dtEndOfDay)as Year_Week,

                     casewhenday(@dtEndOfDay)< 10 then'上旬'

                          whenday(@dtEndOfDay)> 20 then'下旬'

                      else'中旬'  end  as TenDays, 

           

                    Datepart(dw,@dtEndOfDay)as WeekDay_num,

                    datename(dw,@dtEndOfDay)as WeekDay_CN,

 

                    casewhendatename(dw,@dtEndOfDay)='星期一'then 1

                         whendatename(dw,@dtEndOfDay)='星期二'then 2

                         whendatename(dw,@dtEndOfDay)='星期三'then 3

                         whendatename(dw,@dtEndOfDay)='星期四'then 4

                         whendatename(dw,@dtEndOfDay)='星期五'then 5

                         whendatename(dw,@dtEndOfDay)='星期六'then 6

                    else 7 endas  WeekDay_Short_CN,

 

                    casewhenDatepart(dw,@dtEndOfDay)  = 1 then'星期一'

                         whenDatepart(dw,@dtEndOfDay)  = 2 then'星期二'

                         whenDatepart(dw,@dtEndOfDay)  = 3 then'星期三'

                         whenDatepart(dw,@dtEndOfDay)  = 4 then'星期四'

                         whenDatepart(dw,@dtEndOfDay)  = 5 then'星期五'

                         whenDatepart(dw,@dtEndOfDay)  = 6 then'星期六'

                    else'星期日'endas WeekDay_EN,

 

                    casewhenDatepart(dw,@dtEndOfDay)= 1 then'週末'

                         whenDatepart(dw,@dtEndOfDay)= 7 then'週末'

                    else'平時'endas Weekend

 

        set @dtEndOfDay = @dtEndOfDay + 1

        set @DateKey =convert(varchar,@dtEndOfDay,112)

        end

 

END

 

實現日期維度


       在<星型模型_Dome >方案的基礎上把 名字改爲 <星型模型VS雪花模型_Dome>,把雪花模型跟星型模型作在一塊兒方便對比。根據前面演示的步驟把日期表Dim_Date導入,按照步驟一步一步的完成下圖的日期維度,這個type類型必定要設置成time , 若是沒有設置成time 後面的MDX同比環比就很差經過層結構計算。

 

項目維度


       導入房間、樓棟、項目、區域四個維度表創建好關係,下圖地產分析就是典型的雪花模型,

 

 

在建立項目信息維度時有最爲核心的一步是他們是層級關係。

 

 

地產多維數據集


      

 

歷史文章:

FocusBI: SQL Server內核

企業數據管理戰略

FocusBI: 總線矩陣(原創)

FocusBI: 數據倉庫 (原創)

FocusBI: 商業智能場景(原創)

FocusBI: SSIS體系結構(原創)

FocusBI: 使用Python爬蟲爲BI準備數據源(原創)

FocusBI: SSIS 開發案例(原創) 

FocusBI關注者
FocusBI:SSAS體系結構(原創)
FocusBI:租房分析&星型模型
FocusBI:地產分析&雪花模型
FocusBI:MDX檢索多維模型
FocusBI:租房分析可視化(網址體驗)

FocusBI: 《DW/BI項目管理》之數據庫表結構 (原創)

FocusBI:《DW/BI項目管理》之SSIS執行狀況

相關文章
相關標籤/搜索