商業智慧應用 10download.microsoft.com/.../mdx.pdf · 2018-10-13 · sql server 2005 mdx...
TRANSCRIPT
10
為了讓讀者活用先前所學到的MDX知識,所以本章列舉了幾個實際應用
的範例。希望藉由這幾個範例,更能體會出MDX語法的精簡卻又強大的
威力。MDX語法以短短幾行程式碼,就可達成多樣化複雜的分析,雖然
使用SQL也可達成,但其所花的氣力與執行效率卻是⋯。
CHAPTER
商業智慧應用
10.1 柏拉圖分析
所謂「柏拉圖法則」就是找出比例高的少數項目來加以控制,比例低的少
數項目就比較不是所關心的重點。例如:80/20法則與物料管理所使用的
「ABC分析法」,皆為從該法則延伸而來。若以銷售分析為例,總營收
的80%可能是由20%的客戶或產品貢獻的;在生產現場,可能少數幾個不
良原因卻佔了總數的80%。如物料可依單價或其他屬性,將所有物料分成
ABC三類。
柏拉圖(Pareto)分析之應用範圍很廣,特別是涉及因素非常廣泛的情
況,各個因素所佔影響之比例不同,使用柏拉圖找出重點因素,進而針對
重點因素加以解決,則問題已解決一大半。
在做柏拉圖分析時,須先將項目排序(一般是遞減排序),然後計算出累
積百分比,再繪製成圖。以Adventure Works為範例,分析Clothing下各
項Subcategory的銷售。其語法如下:
with
Set [OrderSet] as
Order(
[Product].[Product Categories].[Clothing].Children,
[Measures].[Sales Amount],
DESC )
Member [Measures].[排名] as
Rank(
[Product].[Product Categories].CurrentMember,
OrderSet
)
Member [Measures].[累積金額] as
Sum(Head([OrderSet],[排名]),[Sales Amount])
Member [Measures].[百分比] as
[Sales Amount]/sum(OrderSet,[Sales Amount]),
Format_String = "Percent"
Member [Measures].[累積百分比] as
366
10商業智慧應用
SQL Server 2005 MDX 商業智慧應用
10.1柏拉圖分析
Sum(Head([OrderSet],[排名]),[百分比]),
Format_String = "Percent"
select
{[Measures].[Sales Amount],
[Measures].[排名],
[Measures].[累積金額],
[Measures].[百分比],
[Measures].[累積百分比]} on 0,
[OrderSet] on 1
from [Adventure Works]
執行結果如圖10-1所示。
圖10-1:對Clothing的各項Subcategory做柏拉圖分析
將結果繪製成圖表,如圖10-2所示。
圖10-2:對Clothing的各項Subcategory做柏拉圖分析的分析圖
367
柏拉圖分析圖會是以「雙Y軸」呈現,左方的軸表示各項目的數值,右方
的軸表示百分比。數值以直條圖呈現,累積百分比以折線圖呈現,之後
再將累積百分比區分成2或3個級距。圖10-2為依80/20法則分類,可看出
前四項Subcategory就佔了全部的80%,80/20法則只是一個常用的區分
方式,當然也可是70/30、60/40⋯等。此外,如果區分0~80、80~95、
95~100等三個級距,即為ABC分析,如圖10-3所示。
圖10-3:ABC分析
10.2 Z字圖-變動分析
Z字圖分析,顧名思義其所呈現的圖形像英文字母的「Z」,通常用來分析
與時間相關的變動。首先,確認要分析的時間區間,例如:2003年中的12
個月。「Z」,代表分析圖上有三條線,每一條線各表示一個數值,一個
為要分析的量值,其他兩個量值是依此量值與時間的關係計算而來,這兩
個量值分別為:
◆ 遞移加總:依時間排序,將要分析的量值作累積加總。例如:5月=
1~5月的總和。
◆ 移動加總:每個時間的移動加總,為該時間點往前推與分析區間同
樣的區間,計算此區間的總和。例如:要分析的時間區間有12個
月,則5月=去年6月到今年5月的總和。
A B C
368
商業智慧應用
10
SQL Server 2005 MDX 商業智慧應用
Z
字圖︱變動分析
10.2
若要分析Adventure Works,時間區間為2003年的12個月,分析量值為
Sales Amount,其範例程式碼如下:
with
Set [TimeSet] as
DESCENDANTS(
[Date].[Calendar].[CY 2003],
[Date].[Calendar].[Month])
Member [Measures].[遞移加總] as
Sum(
{[TimeSet].Item(0):
[Date].[Calendar].CurrentMember},
[Sales Amount])
Member [Measures].[移動加總] as
Sum(
LastPeriods(
Count(TimeSet),
[Date].[Calendar].CurrentMember),
[Sales Amount])
select
{[Measures].[Sales Amount],
[Measures].[遞移加總],
[Measures].[移動加總]} on 0,
TimeSet on 1
from [Adventure Works]
將要分析的時間區間變成一個集合,這樣可以少寫很多程式碼,使用起來
也方便。如果要分析其他年份,或某幾個月,只要改變此集合的成員即
可,其他程式碼都不用改變。查詢結果如圖10-4所示。
369
圖10-4:產生Z字圖所需資料
結果將其繪製成「Z」字分析圖,如圖10-5所示。
圖10-5:2003年Sales Amount的Z字圖分析
接下介紹各種「Z」字圖形所隱含的意義,Z字圖依移動加總(最上面那
條)的斜率可分成3大類型:成長型、持平型和衰退型,不同的類型與去
年同期比較的分析圖有相關性,可為其參考。將Z字圖的類型和與去年同
期比較的分析圖綜整如下表:
移動加總
遞移加總
Salas Amount
370
商業智慧應用
10
SQL Server 2005 MDX 商業智慧應用
類型 Z字圖 與去年同期比較(粗線表示現在)
成長型
持平型
衰退型
表10-1:Z字圖的3大類型和與去年同期比較對照
移動加總的斜率越大,表示今年比去年好;斜率接近0,則與去年差不
多;如果斜率是負的,則表示比去年差。移動加總與其他量值最大的不同
是:移動加總較不受季節因素所影響。
觀察遞移加總,可看各月的貢獻度。大於45度的線段,表示較上月成長;
小於45度,表示較上月衰退。
10.3 預測與分配
導入「商業智慧」後,透過OLAP資料庫,可以快速分析大量的歷史資
料,並以多維的方式呈現資料。但這不是最終目的,最終目的為:依據過
往的經驗,對未來做出正確的決策,如:「營運計畫」、「預算」⋯等。
如何做這些計畫,其所牽涉的Domain Know How廣而深,但就實作而
言,核心動作是將預測值向下分配或向上累計。而預測值怎麼來,怎麼向
下分配,怎麼向上累計,這中間的學問就大了!
371
預測與分配
10.3
以下為一個簡單的範例,示範如何利用回歸分析取得下一年度的總銷售
額,再依據去年各個Category與去年總銷售額佔比來分配,計算出各個
Category下一會計年度(Fiscal Year)目標值。
步驟1 先製作出最終結果的格式。
WITH
Member [Measures].[2004] as
([Date].[Fiscal Year].[FY 2004],[Sales Amount])
Member [Measures].[2005目標] as
null
Member [Measures].[佔比] as
null
Member [Measures].[分配值] as
null
Select
{[2004],[2005目標],[佔比],[分配值]} on 0,
[Product].[Category].Members on 1
from [Adventure Works]
執行結果如圖10-6所示。
圖10-6:最終結果的格式
導出量值2004為FY 2004的Sales Amount,供對照參考。
372
商業智慧應用
10
SQL Server 2005 MDX 商業智慧應用
步驟2 以線性迴歸計算2005年各類別趨勢的目標值。
WITH
Member [Measures].[2004] as
([Date].[Fiscal Year].[FY 2004],[Sales Amount])
Set [YearSet] as
{[Date].[Fiscal Year].[FY 2002],
[Date].[Fiscal Year].[FY 2003],
[Date].[Fiscal Year].[FY 2004]}
Member [Measures].[ID] as
[Date].[Fiscal Year].CurrentMember.Properties("ID")
Member [Measures].[2005目標] as
LinRegPoint(
5,
YearSet,
[Sales Amount],
[Measures].[ID]),
Format_String = "Currency"
Member [Measures].[佔比] as
null
Member [Measures].[分配值] as
null
Select
{[2004],[2005目標],[佔比],[分配值]} on 0,
[Product].[Category].Members on 1
L i n R e g P o i n t函數的說明請先參閱《第8 . 4節:數值函數》。因為
LinRegPoint需要多組(x,y)值來計算其回歸線,這裡只有一個量值[Sales
A m o u n t]為y,所以利用每個成員都有的成員屬性「 I D」當作x。F Y
2002、FY 2003、FY 2004的ID分別為2、3、4,所以用5當作LinRegPoint
的第一個參數(x),求出FY 2005的值(y)。計算結果如圖10-7所示。
373
預測與分配
10.3
圖10-7:2005年所有產品推估的目標值為65939721.26
步驟3 計算佔比。
Member [Measures].[佔比] as
[Measures].[2004]/
CoalesceEmpty(
([Product].[Category].CurrentMember.Parent,
[Measures].[2004])
,[Measures].[2004]),
Format_String = "Percent"
目前值÷父階值,得到各Category的佔比。使用CoalesceEmpty函數避免
分母為0的錯誤。
步驟4 計算分配值。
Member [Measures].[分配值] as
([Product].[Category].[All Products],[2005目標])
* [佔比],
Format_String = "Currency"
所有產品的總目標值*佔比,得到各Category分配到的值,最後結果如圖
10-8所示。
圖10-8:將2005年目標值依2004年佔比分配到各Category
374
商業智慧應用
10
SQL Server 2005 MDX 商業智慧應用
排名分析
10.4
此結果可以再計算「2005目標」與「2004」、「分配值」與「2004」、
「分配值」與「2005目標」的差異。如果要取出資料再利用,可以在表格
中按滑鼠右鍵選擇「全選」、「複製」,然後貼到Excel中。
10.4 排名分析
第8章已經有舉一些排名相關的範例,這裡再做更進階的應用。此範例為
找出網際網路銷售中,前三名國家與各國家中前5名的熱銷商品,並計算
每個銷售額在這15筆資料中的排名與每個產品在全部產品的排名。步驟與
範例如下:
步驟1 找出網際網路銷售前三名的國家。
Set [TopCountry] as
TopCount(
[Customer].[Country].[Country].Members,
3,
[Measures].[Internet Sales Amount])
步驟2 前三名國家中,各國家前5名的熱銷商品。
Set [TopProd] as
Generate(
{TopCountry},
TopCount(
{[Customer].[Country].CurrentMember *
[Product].[Product].[Product].Members},
5,
[Measures].[Internet Sales Amount]))
使用Generate函數,根據前三名國家的集合動態產生各國家前5名的集
合,然後將全部集合聯集。
375
步驟3 計算每個銷售額在這15筆資料中的排名。
Member [Measures].[Rank1] as
Rank(
([Customer].[Country].CurrentMember,
[Product].[Product].CurrentMember),
Order(
[TopProd],
[Internet Sales Amount],
BDESC))
在這15筆資料中的排名,也就是對步驟2產生的集合TopProd做排名,
TopProd含有兩個維度,所以Rank的第一個Tuple參數也必須跟TopProd
有相同的維度性。BDESC旗標表示打破階層遞減排序。
步驟4 每個產品在全部產品的排名。
Member [Measures].[Rank2] as
Rank(
[Product].[Product].CurrentMember,
Order(
[Product].[Product].[Product].Members,
([Customer].[Country].[All Customers],
[Internet Sales Amount])
,DESC))
這個量值是此範例最不容易寫出來的,因為軸上除了產品維度外,還有
地區維度。如果排序時,Order的第二個參數沒有加上[Customer].[Cou
ntry].[All Customers],那結果會變成依照每個[Customer].[Country].
CurrentMember的Internet Sales Amount將產品排序,結果會是同樣的
產品因各地區的銷售量,導致在各區有不同的排名。但我們要的是該產品
不分區域的總排名,正確結果應該是同樣的產品排名也一樣,如圖10-9所
示。
376
商業智慧應用
10
SQL Server 2005 MDX 商業智慧應用
遞迴計算
10.5
將此四個步驟的程式碼,前面加上WITH,最後加上:
Select
{[Internet Sales Amount],[Rank1],[Rank2]} on 0,
{TopProd} on 1
from [Adventure Works]
即為完整的範例,執行結果如圖10-9所示。
圖10-9:排名分析
10.5 遞迴計算
在新增計算量值時,可以將原來既有的量值做運算,但是如果是自己要跟
自己做運算,這種遞迴的計算該如何解決?舉個例子:期末庫存=期初庫
存+期間進-期間出,而期初庫存為上期期末庫存。已經有了各期的進與
出,如何根據這兩個值來產生「期末庫存」?假設來源資料如圖10-10所
示。
377