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 進階彙總囉!!

2014年8月4日 星期一

什麼是Partial Reload 如何部份更新資料?

你有多少龐大的資料需要每天,每小時更新一次?
或者是當日資料的修改資料要定時的上傳分析?
Partial Reload 允許的QlikView應用時,添加或更換的資料表到資料模型裡,同時保留現有的表不會受到影響。由於選擇更換的資料表資料量已經變少了,所以更能Reload重新加載變得更快。

如何讓Partial Reload生效,最重要的就是要在語法裡增加前置提示  Replace 或 Add
例如:
  Table1:
  LOAD s_store_id, s_store_id From store.csv;                            //(這是正常的 relaod)
  Add LOAD s_store_id, s_store_id From Newstore.csv;            //(這是 Partial reload)

Table1:
   LOAD s_store_id, s_store_id From store.csv;                          //(這是正常的 relaod)
   Replace LOAD s_store_id, s_store_id From Newstore.csv;     //(這是 Partial reload)

正常的 relaod - 第一語句將執行產生Table1, 但立刻被第二句取而代之的是 Newstore 的內容但是表的名稱是 Table1;
Partial reload- 第一語句不會被執行, 但立刻被drop掉,第二句取而代之的是 Newstore的內容但是表的名稱是 Table1

下圖為資料表 store.csv     










下圖為資料表 Newstore.csv

執行後的結果為:
s_store_sk = 1 的資料s_store_id 變成test 了 , 第15,16的新資料也進來了

範例下載Sample 請按此
在我的範例中有提供三種不同的更新語法可以參考哦!!

2014年7月31日 星期四

QlikView 也能套印報表 ( How to setting a official report in QlikView )

除了彈性互動的分析之外,QlikView也可以產生公司套表的報表格式,例如有表頭的公司名稱啦,及表尾的簽名欄;而且設計這些Reports一點都不難,只要掌握幾個技巧你也可以輕鬆的設定報表,並可以定時的產品PDF 檔案出來。


  • 編輯報表,新增一張報表

  • 報表設定 , 用來調整紙張邊界,頁首頁尾的文字




  • 頁面設定 , 所有控制頁面內容設計 (包含橫向還是直向紙張,長表格資料跨頁以及頁首,頁尾的說明文字)
*資料表格會跨頁時請選 "多選頁"



* 若資料要以某個主題作為篩選分頁時,請勾選下列

* 若資料有前後頁說明,或是你要Show出篩選分頁的內容時,可以將簡介高度設為5%左右,再將分頁的欄位拉至此空間裡就可以達到每一頁分頁時都可以看到是以那個資料作為篩選分頁的內容。


重新用顏色視別設定的區域圖



接著我們就可以來列印看看囉 :) 






2014年7月9日 星期三

將整理好的資料排程滙出成TXT 檔 export txt file format from MARCO


如何將整理好的資料排程滙出成TXT 檔

步驟1:
Edit Module  ( Ctrl+M )  , 增加下列語法
/*===============================
Sub exp()

Dim strNow, strDD, strMM, strYYYY, strFulldate
strYYYY = DatePart("yyyy",Now())
strMM = Right("0" & DatePart("m",Now()),2)
strDD = Right("0" & DatePart("d",Now()),2)
fulldate = strYYYY & strMM & strDD

set obj = ActiveDocument.GetSheetObject("CH06")

obj.Export "C:\ProgramData\QlikTech\Documents\DataName"&fulldate&".txt","|" 
ActiveDocument.Save
Application.Quit
End Sub

/*===============================
說明:  CH06 是你要滙出資料表的ObjectID 
obj.Export 後為檔名而 "|" 為輸出時的欄位間隔符號





步驟2:
           加入一個OnPostReload 的Trigger ;
            下列圖中我有先指定只要前一天的資料條件,再執行Marco



以上存好後再用command 的方式執行就會自動出現滙出的TXT 檔案囉.



2014年7月3日 星期四

QlikView 語法攻略 - 改變用IF 換成用Pick + Match

每次在寫資料計算判斷時寫了一大堆的IF 都讓我不知道該怎麼看語法到底對應到那個去了,
就想到在SQL 語句裡常寫的CASE....WHEN.....END 方式;
我們先來看之前的笨笨寫法如下.

if(status=A,green,
         if(status=B,Amber,
                  if(status=C,Red,Grey))).

看到了嗎,上頭一堆IF 的判斷,再亂一點我就看不出來是在true 還是false 的條件了
所以我改了寫法如下

pick( match(status, 'A', 'B', 'C')+1, 
         'Grey'       ,
         'green'     ,
         'Amber'    ,
         'Red'
      )

說明: status 是欄位; 判斷欄位內容中是'A' 還是'B'還是'C' , 而+1 是為了其它值使用.

QlikView - Set Analysis 日期時間分析

常常寫到要做日期期間比較的分析,整理一下公式如下:


上月
sum({$<Year={'$(=Year(AddMonths(Max(OrderTime),-1)))'}
    ,Month={'$(=Month(AddMonths(max(OrderTime),-1)))'}
    ,[Shop Name]=>} SalesAmt)
 
說明:
OrderTime 是一日期欄位
Max(OrderTime) 是取得目前條件日期選擇中最大的日期
Month(AddMonths(max(OrderTime),-1) 取得少一個月的月份資料;利用此方式才能真正抓到1月份時的上個月是12月份資料。


指定月份期間   

Sum({<, ,Date={'>=$(=AddMonths(Date, -1 ) )<=$(=AddMonths(Date,-1))'}>}SalesAmt)
上年同月
sum({$<Year={'$(=Max(Year)-1)'} , [Shop Name]=>}  SalesAmt)
去年
Sum({$<Year={$(=Max(Year)-1)}>}  SalesAmt
本月() 可用為YTM
sum({$<Month={">0<$(=max(Month)+1)"}  ,[Shop Name]=> } SalesAmt)

Command line execute Reload / partial Reload 指令更新資料

個人版也可以自動化的重新更新資料!

最近有需要寫到Batch 批次檔執行的動作,剛好有也和大家來分享,如何利用指令的方式讓QV執行Reload

Command Reload
"C:\Program Files\QlikView\QV.exe" /r  "documentName.qvw"


Partial Reload
"C:\Program Files\QlikView\QV.exe" /rp " documentName.qvw"




@rem * Command Line Arguments (QVCMD) *
@rem ********************************************
@rem * /r  = Open, Reload, Save, Close *
@rem * /rp = Open, Partial Reload, Save, Close *
@rem * /l  = Open, Reload *
@rem * /p  = Open, Partial Reload *
@rem * /v  = Pass Variables eg /vBatchFlag=1 *
@rem ********************************************

2014年4月1日 星期二

And-Mode:How to find your customer 原來QlikView 不是只有綠色 也有紅色


QlikView 本身有綠白灰三個顏色,分別代表是"選擇,答案及非關連"
其實,QlikView 也有紅色的耶


上圖的例子綠色表示And 紅色表示Not ;
意境是 : 找出我的客戶群中有買Atles Lussekofta , Basket Shoes 產品,但是沒有買 Cap的客戶是誰? 

建立一個table ,串接資料將客戶對應多筆產品的資料組成一個新表格
andModeJoin:
Load CustomerID, Customer Resident Customers;
Join (andModeJoin)LOAD OrderID, CustomerID Resident Order_Header;
Join (andModeJoin)LOAD ProductID, OrderID Resident Order_Details;
Join (andModeJoin)LOAD ProductID, ProductName Resident Products;

這表格的長像如下:
customer01 product1
customer01 product2
customer02 product1....

這是直接應用在同一個欄位上的方式,其實QV也有另種方式,是利用Alternate 方式來讓前台人可以分析兩個相同欄位,但是用Alternate 沒有And 的關係他是OR 的方式;
意境是 : 找出我的客戶群中有買Atles Lussekofta 或是 Basket Shoes 產品的客戶中,但是沒有買 Cap的特定客戶是誰?

命名一個Excluding  Alternate : 在document 屬性設定>一般 > Alternate
建立一個Chart , 其運算式為
sum({$<ProductName = p({$} ProductName) - p({[Excluding]} ProductName)>} UnitPrice)





2014年3月28日 星期五

Naming your field names in QlikView 取一個你看的懂的欄位名稱

擁有一個乾淨友好的使用者介面看得懂的欄位名稱,是一套針對使用者操作的一個關鍵。

在分析資料時,往往在資料庫裡的資料欄位跟前端拉取資料命名會不太一樣,如果要前端看的懂的欄位名稱在QlikView 中欄位別名,必需要使用 "as" 來重新命名,如下圖例子:


在前端取德欄位會像這樣

那如果都我要用中文欄位呢?都取別名實在太辛苦了,萬一我的資料源來及欄位很多時,這種做法實在是太不科學了。

接下來就是要教各位一個小小的技巧,讓我們可以方便取名
Step 1:  利用一個List box 將所有欄位滙出來
             請選擇系統欄位$Field
             列出資料後,直接滙出到Excel

Step 2:  利用剛滙出的EXCEL 檔案,增加一個欄位為使用者識別的欄位


Step 3: 回到Script 編輯器中,將剛那個EXCEL檔案滙入
           使用MAPPING LOAD statement 於語法編輯器

Step 4: Applying the field name map
            請在語法的最後加入一行,Using 後的就是剛滙入的表格名稱
      RENAME FIELDS USING FieldMap;

*在這裡有一個要注意的地方,如果在步驟3所Mapping 的欄位沒有包含全部欄位時,則欄位名稱會以舊的為主

Step 5: 重新Reload 資料後,剛你所設定的欄位名稱就出來囉.

2014年3月26日 星期三

QlikView and Google Map integration Step-by-Step

你想要有張地圖結合你資料的呈現嗎? 我們可以在QlikView 上很快速的套用囉
下列方法是一步步的執行方式參考,吔...這表示我有偷吃步啦,
想知道嗎?嘿嘿,待我下回分曉囉.
  

  1. 首先,第一步請增加一段語法在QV的語法編輯器中 
Edit Script
Ctrl+E 
請注意,你的分析資料中必需要有欄位為Latitude,      Longitude才能跟Google 連結

例如:
member:
LOAD 會員編號, 
     姓名, 
     姓別, 
     電話, 
     生日, 
     [E-mail], 
     地址, 
     GPS, 
     Latitude, 
     Longitude, 
     星座
FROM
會員檔.xlsx

(ooxml, embedded labels, table is 會員資料);

======================

//請整個複製到語法中
// Google Maps Key
// 申請一個MAP 的KEY 並填入下方 here http://code.google.com/apis/maps/signup.html  
gmap_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
max_zoom_level = 17; //maximum value 17 

// Variables required for calculating map
// No need to change these
var_pi180= '=pi()/180';
var_lat_offset= '0';
var_mc2= '=256*pow(2,$(var_zoom))';
var_mc1= '=256*pow(2,($(var_zoom)-1))';
var_mid_lat= '=min(Latitude)+(1+var_lat_offset)*((max(Latitude)-min(Latitude))/2)';
var_mid_long= '=min(Longitude)+(max(Longitude)-min(Longitude))/2';
var_zoom= '=max(aggr(if(max( round(256*pow(2,(_zoom_level -1)))+( Longitude  *((256*pow(2,_zoom_level ))/360)) )-min( round(256*pow(2,(_zoom_level -1)))+( Longitude  *((256*pow(2,_zoom_level ))/360)) ) <map_size_x AND max((256*pow(2,(_zoom_level-1)))+((0.5*log((1+(sin((Latitude)*pi()/180)))/(1-(sin((Latitude)*pi()/180)))))*((-256*pow(2,_zoom_level))/(2*pi()))))-min((256*pow(2,(_zoom_level-1)))+((0.5*log((1+(sin((Latitude)*pi()/180)))/(1-(sin((Latitude)*pi()/180)))))*((-256*pow(2,_zoom_level))/(2*pi()))))<map_size_y,_zoom_level,1),_zoom_level))';
var_maptype= '=if(isnull(only(maptype)),fieldvalue( '&chr(39)&'maptype'&chr(39)&', 1 ),maptype)';
map_size_x=  '640';
map_size_y=     '400';


SET HidePrefix='_' ;
// Field required for calcualting best zoom level
_zoom_level:
Load RecNo( ) as _zoom_level autogenerate(max_zoom_level);

maptype:
LOAD * INLINE [
    maptype
    roadmap
mobile
satellite
terrain
hybrid 
];



  
==================================
離開語法編輯器, 到Design Sheet 頁中
2.增加一個Cart 圖於畫版裡 scatter chart


選 擇Scatter chart => NEXT



=> NEXT
 選擇資料欄位

 => NEXT

 新增3個運算式 , 除了運算式3可以自行指定運算式外,運算式1,2 都建議不可以更改
  1. 運算式1 => Label : Longitude  


  • 輸入公式:  sum( round (256*pow(2,($(var_zoom)-1)))+( Longitude  *((256*pow(2,$(var_zoom)))/360)) )
  • 點開公式下增加 Background color:  公式為:=ARGB(150,255,0,0)
     2. 運算式2 =>  Label :  Latitude 
  • 輸入公式: 
=sum(  ((256*pow(2,($(var_zoom)-1)))+((0.5*log((1+(sin((Latitude)*pi()/180)))/(1-(sin((Latitude)*pi()/180)))))*((-256*pow(2,$(var_zoom)))/(2*pi())))))
  • 點開公式下增加 Background color:  公式為:ARGB(150,255,0,0)
  3. 運算式3 => Label: Sales 





  => NEXT
選擇顯示的樣式
 => NEXT

  => NEXT

X axis:
Static Min:
=(256*pow(2,($(var_zoom)-1)))+( var_mid_long  *((256*pow(2,$(var_zoom)))/360)) -round(map_size_x/2)
Static Max:
=( (256*pow(2,($(var_zoom)-1)))+( var_mid_long  *((256*pow(2,$(var_zoom)))/360)) + round(map_size_x/2))

Y axis:
Static Min:
=((256*pow(2,($(var_zoom)-1)))+((0.5*log((1+(sin(var_mid_lat*pi()/180)))/(1-(sin(var_mid_lat*pi()/180)))))*((-256*pow(2,$(var_zoom)))/(2*pi())))+round(map_size_y/2))
Static Max:
=((256*pow(2,($(var_zoom)-1)))+((0.5*log((1+(sin(var_mid_lat*pi()/180)))/(1-(sin(var_mid_lat*pi()/180)))))*((-256*pow(2,$(var_zoom)))/(2*pi())))-round(map_size_y/2))

 => NEXT選擇 Dynamic Image:


='http://maps.googleapis.com/maps/api/staticmap?center='  &  num(var_mid_lat, '##############', '.', ',' )   &  ','  &  num(var_mid_long, '##############', '.', ',' )   &  '&zoom=$(var_zoom)'  &  '&maptype='&var_maptype  &  '&size='&map_size_x&'x'&map_size_y  &  '&key='&gmap_key & '&sensor=false&.jpg'&

'&language=zh-HK'