2015年2月2日 星期一

QlikView 的超強 Data Modeling

QlikView 超強的 Data Modeling

話說一般BI 大都是要先在資料庫端處理好資料,及整理資料後才能介接到BI 上將資料抓出分析,現在的工具甚至還能同時混用異質性資料,但是要每個異質資料都配合你所要要的資料格式給你分析實在是不太可能,所以還是得認份的自己處理資料的!!

簡單來介紹幾個在語法裡用到的像是:
  • resident:先前載入的表格載入資料 重覆拿下來進行運算或是其它資料處理;若資料只想保留運算後的你還能利用Drop Table xxxname;方式來刪除表資料。 
1| tab1:
     Load * ;
       SQL Select A,B,C,D from transtable;
      2| Load A,B,month(C),A*B+D as E resident tab1; 
        3| Load A,A+B+C resident tab1 where A>B;
          4| Load A,B*C as E resident tab1 order by A;
            5| Load A,B*C as E resident tab1 order by 1,2;
              6| Load A,B*C as E resident tab1 order by C desc, B asc, 1 desc;


              • 載入不在檔案上的資料



              Load * Inline
                [CatID, Category
                 0,  Regular
                 1,   Occasional

                2,   Permanent];


              • 將資料分組

              用來試先先運算資料,來儲存
              Load ArtNo, round(Sum(TransAmount),0.05) as ArtNoTotal from table.csv group by ArtNo;

              Load Week, ArtNo, round(Avg(TransAmount),0.05) as WeekArtNoAverages from table.csv group by Week, ArtNo;



              以上先初步列出幾組,但其實還有很多應用,例如使用Web Log ,等LOG 資料的載取,
              都是可以在QV 用一套工具就可完成處理資料到資料分析的功能。

              2014年12月15日 星期一

              QlikView 超強的 Data Modeling- Crosstable精靈教你如何轉換表格

              你是不是也有下圖這類型表格資料,尤其在做年度預算時更是常常出現;這類的資料在QV裡就像是"一塊小蛋糕",我們可以利用精靈的方式就可以將資料滙入囉!一點都不需要在次資料表格的加工


              =====================================================================
              步驟說明:
               
              選擇table files點選你的檔案,接著點選下一步


              你會發現這張報表有些表頭資料是我們不需要的,你可以選擇"Delete Marked" ,但是考量到以後我可能有重覆的資料要滙入所以還是套用判斷式比較好,接下來我們使用此方法來示範

              選擇conditional deleted ,注意我下圖中有圈選欄1這是我拿來判斷,當欄1有空值時就刪除不要滙入資料


              按OK 後就會出現像下圖一樣,表頭空白的資料不見了。


              接著下一次,我們來處理交叉表格的處理
              首先,我們先訂義Label ,再點選Cosstable 


              出現此畫面時,就是在定義你的横軸資料跟原本的維度資料,
              紅色的地方指的就是不需要轉換方向的欄位
              綠色指的是要轉換方向的維度,並且可以重新命名為"Month"
              藍色指的是資料值,重新命名為"AMT" 然後確定



              看到了嗎,資料已經從橫向變成直的囉!


              2014年12月2日 星期二

              如何加快QlikView速度及效能-1


              如何加快QlikView速度及效能



              • Allow Minimize  縮小時QV 不會運算,當打開來時才會運算

              •  Calculation Condition  如果條件不符合時,則資料不會運算,且資料內容可以呈現ERROR 提示訊息

              • Data Model Scenarios and Solutions 

              • Complex Dimensions and Expressions  盡量減少複雜的維度計算,及Count() 方式,
              如果要減少COUNT() 你可以在Script語法裡增加一個虛欄位OrderRecordCounter , 例如 :
              LOAD
              OrderID,
              1 as OrderRecordCounter
              Resident Facts;

              之後要統計時只需要用SUM(OrderRecordCounter)即可


              2014年11月24日 星期一

              QlikView 語法攻略- 列出維度欄位控制選擇條件

              最近在國外BLOG 看到一個範例與大家分享
              這個範例原本是在說明另一種使用Chart Object 呈現像multibox選擇條件的方式
              但是其中使用了一項控制方式特別拿出來跟大家說明一下
              因為這樣的應用再進階一點可以控制到使用維度的互動,或是User 可用的維度呈現控制
















              箭頭下方的Multibox Fields 即為維度清單列表, 使用者勾選了那些表格則會在上方呈現欄位供使用者條件選擇.接下來我們來拆解這個小丿步吧!


              首先  1: 在語法裡必需要新增一個自定的維度清單TABLE
              Multibox:
              LOAD * INLINE
              [
              %Multibox
              Year,
              Name,
              City,
              Country,
              Product,
              Salesperson
              ];

              而Multibox Fields  就是拿取%Multibox 欄位利用List Box 來呈現

              動作 2:  建立一變數名稱為eMultiboxShow
                       公式:   Index('|' & Concat(%Multibox, '|') &   '|', '|' & $1 & '|') > 0

                       Concat(%Multibox, '|')  指是的選擇欄位的合併, 例如: 選了year , name
                      則資料的組成就會變為   year|name
                      那整個公式的測試請改為下列 , 例如 'Year'   ; 有發現嗎原本公式是$1 但現在用'Year'取代         了, 這個的意思是$1是傳入的參數的第一位,只是我們現在直接用Year 來使用  
                    *替代語法*  Index('|' & Concat(%Multibox, '|') &   '|', '|' & 'Year' & '|') 

                    {Examples index() 找出字串位置 :  
                                          index( 'abcdefg', 'cd' ) returns 3
                                index( 'abcdabcd', 'b', 2 ) returns 6
                                          index( 'abcdabcd', 'b', -2 ) returns 2
                   }
                  運用了Index() 查字串的特性,所以會得到>0 的位置

              動作 3: 啓動條件  在Chart Object
                     
                           在啟用條件式用填入 $(eMultiboxShow('Year'))
                            $() 是使用變數的意思,eMultiboxShow 是我們剛剛設的變數名稱,需要傳入值來取代$1 這數是傳用'Year'  這個就會和*替代語法*一樣了, 有發現嗎


              以上很簡單的方式就能控制條件了。
              而原本的Multibox 改進的方式可參考國外網站

              2014年11月2日 星期日

              Document Chaining - 檔案鏈接 大資料量分析方式之一

              其實我們大部份的分析行為都是針對統計運算後的數值來解析, 但是
              實際上我們都是利用明細資料來運算出來的, 也因為如此以前的OLAP 方式就會變成效能愈來愈差的狀況,但實際上我們應當要將資料的屬性切分開來,怎麼說呢?
              其實就是引導使用者先以高視角的方式分析出資料,找出自己想看的資料區間後,再引導使用者查看明細資料,這樣的做法可以加快且有效率的讓使用者可以快速分析問題, 又不用一開始就開一個很大的明細檔來分析。

              這方式簡單來說就是分析像EXCEL 的樞紐分析, 點選要的分析區域後再查看明細.

              那在QlikView 的執行方式是什麼呢?
              我們可以利用類似的方法叫做"Document Chaining"

              會有一個事先滙總的分析資料, 利用維度條件串接明細資料條件
              如下圖, 左方是一個滙總的分析,其維度有日期及地點,
              右方是一個明細資料,其維度有日期及地點,
              各位有發現了嗎?    沒錯,就是會相同的維度分析資料
              也就是利用這個方式, 使用者可以快速分析又快速查詢資料

              實現方法:
              先製做兩個APP , 一個為匯總資料, 一個為明細資料 , 其中都有共用的維度
              在滙總的APP 裡建立一個按鈕, 這按鈕是USER 確定要查詢明細時使用,

              建立Actions ,

              2014年10月31日 星期五

              QlikView 語法攻略 - ValueList


              ValueList

              返回一個set資料,呈現於計算中的維度。
              valuelist函數可以創建一個維度資料的圖表(Chart object),可以通過重述與圖表表達的相同參數的valuelist函數來引用對應於一個特定的表達的圖表值。

              所以不是資料一定都要用Inline 寫在Script 裡,若是臨時用表或是一次性使用的維度都可以運用此函數。

              使用方式 :
              下方圖例就是利用valuelist 來產生一個陣列的表


              下載範例: http://community.qlik.com/docs/DOC-5011

              2014年9月10日 星期三

              QlikView 語法攻略 - Aggr 進階彙總函數

              Aggr 進階彙總函數

              其實這個函數用很簡單的比喻就是像是SQL 的Group By 的感覺,舉個例子:


               原始資料的列表:














              Count 各Sales 有多少個客戶










              Aggr彙總出上一步驟中Count 各Sales 有多少個客戶的值,所以下表即呈現1,2,3,5
              而解釋下表就是;
              賣出一個客戶的sales 有2個,賣出2個客戶的Sales 有1個







              以上大家應該可以有解單的了解了,接下來我們來進階挑戰一下:

              問題一, 如果我的欄位是CycleGroup 或是Drill-down 欄位呢, 那怎麼寫這變動的欄位呢?
              解答: 
              ----------------------------------------------------------------------------------------------------------------------------
              將欄位改為[$(=GetCurrentField(CycleGroup))] 即可
              Aggr(count(Customer), [$(=GetCurrentField(CycleGroup))])

              問題二 , 我不知道客戶是選擇了什麼欄位,如何變動判斷?
              解答:
              -------------------------------------------------------------------------------------------------------------------------------
              此時我會建議大家利用字串組合的方式來達成這個目的,
              如: 建立一個變數
              變數 v_DimStrif(GetSelectedCount(SalesRep)>0,', SalesRep')&if(GetSelectedCount(Customer)>0,', Customer' ) 
              修改語法變成 字串組合方式如下:
              =$(='Aggrcount(Customer) ' & v_DimStr &' )'  )
              特別注意:$(=’’) 是字串組合的意思

              如此一來就能彈性動態的Aggr 進階彙總囉!!