微信公衆號: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: 使用Python爬蟲爲BI準備數據源(原創)