今天在天善問答裏看到一個問題,若是我沒有理解錯的話,它應該是指好比在一個報表中選取一個時間段,而後求出這個時間段的某個 Measure 的 SUM 和。而且同時求出這兩個時間點對應的上一年的時間點之間的同一個 Measure 的 SUM 和。html
好比當前選取的時間點是 2004年1月8日,結束時間點是 2004年3月1日。那麼不只要求這個時間段的某度量值總和,而且還要求 2003年1月8日到2003年3月1日時間段的某度量值總和。 也就是說,這個時間段是一個動態的,根據輸入的兩個時間段決定當年和上一年的計算。web
這個裏面有幾個小知識點,因而總結了一下,先看下面這個 Report 的效果。函數
還有使用 Date Picker 的效果 (注意若是使用日曆控件,那麼 StartDate 和 EndDate 的類型都是 Date/Time 類型)-spa
非 Date Picker 參數時的設計.net
在 Cube 中查一下驗證一下,查詢結果都是同樣的。設計
WITH MEMBER [Measures].[Reseller Sales Amount of Period]
AS
SUM( [Date].[Calendar].[Date].&[20040108]:[Date].[Calendar].[Date].&[20040301] ,[Measures].[Reseller Sales Amount] ) MEMBER [Measures].[Reseller Sales Amount of Last Period]
AS
SUM( [Date].[Calendar].[Date].&[20030108]:[Date].[Calendar].[Date].&[20030301] ,[Measures].[Reseller Sales Amount] ) SELECT NON EMPTY{[Measures].[Reseller Sales Amount of Period], [Measures].[Reseller Sales Amount of Last Period]} ON COLUMNS, NON EMPTY { ([Product].[Category].[Category].ALLMEMBERS ) } ON ROWS FROM [Step-by-Step]
新建一個 Dataset - Datedata,鏈接的是 MDX Step by Step 中的示例Cube。3d
MDX 查詢語句取得時間成員和能夠用在 Report 下拉框中的標籤。code
WITH MEMBER [Measures].[DateValue]
AS
[Date].[Calendar].CurrentMember.UniqueName MEMBER [Measures].[DateLabel]
AS
[Date].[Calendar].CurrentMember.Name SELECT { [Measures].[DateValue], [Measures].[DateLabel] } ON COLUMNS, { [Date].[Calendar].[Date]} ON ROWS FROM [Step-by-Step]
建立兩個時間參數 StartDate 和 EndDate 而且綁定到 DateData 中的時間成員,它們選擇的都是 Text 類型,這一點必定要注意!!!。orm
新建一個 Dataset 用來展示表格上的數據,注意在 SSRS Report 中的參數使用通常都是經過這種相似於子查詢的方式完成的。htm
WITH MEMBER [Measures].[Reseller Sales Amount of Last Year]
AS SUM( { -- 根據傳入的參數分別取得上一年的開始時間點和結束時間點
PARALLELPERIOD([Date].[Calendar].[Calendar Year], 1, STRTOMEMBER(@FromDateCalendar, CONSTRAINED) ): PARALLELPERIOD([Date].[Calendar].[Calendar Year], 1, STRTOMEMBER(@ToDateCalendar, CONSTRAINED) ) }, [Measures].[Reseller Sales Amount] ) SELECT NON EMPTY {[Measures].[Reseller Sales Amount], [Measures].[Reseller Sales Amount of Last Year]} ON COLUMNS, NON EMPTY { ([Product].[Category].[Category].ALLMEMBERS ) } ON ROWS FROM ( -- Report 傳入的開始參數和結束參數
SELECT ( STRTOMEMBER(@FromDateCalendar, CONSTRAINED) : STRTOMEMBER(@ToDateCalendar, CONSTRAINED) ) ON COLUMNS FROM [Step-by-Step] )
保存並在 Dataset 中綁定兩個時間參數。
這樣基本上就完成了基於時間區間的同比時間段的報表。
還有一點要注意一下,好比像這個查詢是不會返回結果的,由於2004年的上一年不是閏年。
可是是有2003年2月28日這一天的,儘管下面的查詢返回一個 NULL 可是這個成員是存在的。
Date Picker 時的設計
在文章一開始的時候就介紹了,若是把時間參數設計成日曆形式那麼就須要將參數的類型從 Text 類型改爲 Date/Time 類型。
而且這裏沒有指定可供選擇的值,由於一旦指定了值日曆控件的樣式就又會變成下拉框的樣式。
同時在 DateSet 那裏要改變參數的格式,由於 Date\Time 類型是時間類型,並非字符串類型,所以須要將它們轉變成字符串格式。
轉變的格式代碼以下:
="[Date].[Calendar].[Date].&["& Format(CDate(Parameters!StartDate.Value),"yyyyMMdd") + "]"
你能夠從網上搜索到不少種不一樣的別人告訴你如何轉換格式的經驗和代碼,可是要注意,你首先要肯定的是你要轉換的對象是什麼?它須要什麼格式?
先最好可以經過下面這種最簡單的代碼查看一下這種 Hard Code 形式的參數行不行,沒有問題以後再放到上面去編輯。
在網上搜索到的轉換過程通常都是使用做者本身代碼示例的層次結構,好比說有的就是[Date].[Calendar].&[20040228], 少了一個 Level。
第二就是轉換的字符串格式可能並非 yyyyMMdd 的類型,而是 yyyy-MM-dd 的類型,因此這兩點必定要注意。注意到了,你的轉換纔會成功!
最後一個問題,就是若是用戶選擇了一個非法的成員傳入的時候就會出現這個錯誤,緣由是咱們的成員並不包含 11/1/2013 或者 11/29/2013。因此實際上仍是使用下拉框的形式最直接,最簡單,由於它可直接限定可選擇的內容,能夠作成年月日級聯的效果。
總結:
更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
若是以爲這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。