發布乙個關於統計時間段的mdx語句
折騰倆小時才寫出來,先貼**,再說原理,雖然看似簡單,但知識點也不少,解決過程很曲折(我說我哦)。
with member mydate as now()
select on columns,
on rows
from [使用者和行為簡單分析]
意圖:要統計某月到某月這個時間段內使用者到達數的情況,其中「[日期天]」是維度,「[measures].[到達使用者數]」是度量值,「[日期天].[日期天].[月]」是統計月的層次結構,「[使用者和行為簡單分析]」是多維資料集(立方體)。
解決過程及知識點:
1、首先mdx裡不能像t-sql那樣使用declare語句來宣告變數,需要使用with來定義乙個計算成員。第一行便是宣告了乙個mydate的計算成員。注意在mdx裡的變數和標量和在sql裡一樣,是弱型別的。但當你宣告乙個字串的變數的話應該用雙引號擴住,而不是單引號,而你要宣告乙個日期型的變數的話不用引號,比如宣告乙個表示2023年5月的日期型變數用「with member mydate as 200305」就可以了。當然了這是乙個最簡單的計算成員,計算成員還可以是乙個複雜的層次級別表示式,詳細請參考以下鏈結
ms-help:
2、mdx裡可以把乙個字串表示式轉換成乙個成員或者集的引用,strtomember函式用來完成講字串轉換成成員,然後這個字串你可以用報表引數或者內部計算成員等來拼接而成,從而達到動態查詢的效果。
3、mdx裡並沒有很多的日期和文字處理函式,但它卻可以用大部分的vbs函式和excel表示式,實際上是呼叫的micrisoft.visualbasic命名空間下的相關類,以及其它的一些物件。比如在mdx裡獲取當前時間,就不能用getdate(),而用now()或者date()。而dateadd函式的裡的格式字串,如yyyy,m,d等字串要用單引號或雙引號擴住,否則這個函式執行不過去的。注意在t-sql裡是不用加引號的,如select dateadd(mm, 2, getdate())
4、雖然mdx是弱型別的,但有時候也需要強制型別轉換,因為mydate變數宣告的時候是日期型別,但後面要用它拼接成乙個成員的字串表示式,所以直接用還不行,要用vb的cstr()函式來轉換型別。
5、在mdx裡同樣乙個識別符號,兩邊加上大括號和不加大括號是不一樣的。不加有時候只是乙個級別或者層次,加上有時候就相當於給這個層次執行member函式,就是相當於這個層次識別符號後面加上乙個".members",它就成了乙個集了。
以上都是我個人總結的,含有一定猜的成份,大家不要完全相信哦,接觸bi沒多長時間,好多概念不熟悉,大家看的時候不要以完全信任的心態去看,畢竟是菜鳥的總結,但我的結果肯定是對的,雖然過程比較曲折吧,至少參考我的思路可以解決一些其它相似的mdx問題,因為大家對vbs和excel一般還是很熟悉的。
modify by wawa at 2007.3.31
更正一下哦,上面那語句可能出不來正確結果,我現在改成下面這樣了,計算某年從1月到現在每個月的情況,format格式出來的月份沒有前導的零,我汗,而且在mdx裡宣告日期格式也不能用「with member mydate as 200305」,上面是我錯了,日期目前我發現只能用now,不指點日期怎麼來表示,這個帖子以後我得到答案後更新一下。
with member mydate as dateadd("m",9,now())
select on columns,
on rows
from [使用者和行為簡單分析]
Mysql統計時間段內的使用者(去重)
select b.from vip report vip income b inner join select from select a.from vip report vip income a where 1 1 and a.game id 1005 and yearweek a.report ...
如何判斷乙個時間段是否和另乙個時間段衝突
案例 預訂會議室時判斷提交預訂的時間段是否與已經預訂的時間段衝突 create table roombookinfo id intnot null,title nvarchar 10 notnull,begintime datetime notnull,endtime datetime notnul...
判斷乙個時間段與一組時間段是否有相交
兩個時間段相交分為三種情況,如下圖所示 圖中的數字為時間點的id號 乙個時間段有開始時間點start和結束時間點end表示。1.設定這組時間段彼此互不相交,由陣列列表arraylist表示 timelist,timelist依次加入所有時間段的起末時間點。2.把要判斷的這條時間段的起末時間點依次加入...