Qlikでカレンダーマスタを自動で作成する方法
Qlikを使って、カレンダーマスタを作成する方法を試してみました。細かな解説は気にせずWebにあるスクリプトを参考にして動かしてみました。
※2024年4月時点のQlik Sense Businessを利用しています。
<その1.シンプルに単体で試せる①>
SETのvStartとvEndにカレンダーを作成する開始日と終了日を記述します。 参考)QlikViewでカレンダーを自動生成する @sasanquaneufin株式会社ユニエイム
SET vStart = '2024/05/01';
SET vEnd = '2025/12/31';
temp:
LOAD *
INLINE [
dummy
1
];
For i = date('$(vStart)','YYYY/MM/DD') To date('$(vEnd)','YYYY/MM/DD')
カレンダー:
LOAD
date($(i)) as 日付,
Year(date($(i))) as 年,
'Q'& Ceil(Num(Month(AddMonths(date($(i)),-3)))/3) as 四半期,
Month(date($(i))) as 月,
Day(date($(i))) as 日,
Week(date($(i))) as 週,
WeekDay(date($(i))) as 曜日
Resident temp;
Next
DROP Table temp;
<その1‐2.シンプルに単体で試せる②>
「その1」のSETでの設定をvStartとvEndを固定ではなく「今日の日付」を基準に前後30日を指定しています。今日の日付はToday()関数で取得します。また、計算された値を変数化するためSETではなくLETとしています。(変数の使用:SETとLET の違い)
LET vStart = Today()-30;
LET vEnd = Today()+30;
temp:
LOAD * INLINE
[
dummy
1
];
For i = date('$(vStart)','YYYY/MM/DD') To date('$(vEnd)','YYYY/MM/DD')
カレンダー:
LOAD
date($(i)) as 日付,
Year(date($(i))) as 年,
'Q'& Ceil(Num(Month(AddMonths(date($(i)),-3)))/3) as 四半期,
Month(date($(i))) as 月,
Day(date($(i))) as 日,
Week(date($(i))) as 週,
WeekDay(date($(i))) as 曜日
Resident temp;
Next
DROP Table temp;
<その2.カレンダーマスタとともに利用する明細データから日付期間を指定する>
先行してロードした明細テーブル(売上明細)の最小日付と最大日付を変数に代入してカレンダー期間を動的に設定できます。これだと組み合わせる明細データに応じて余分なカレンダーを作成せずにすみます。(※下記サンプルでは日付以外の項目は省略しました)
▼サンプル①
売上明細:
LOAD * INLINE
[
日付 ,売上
2024/1/2 ,120
2024/1/3 ,140
2024/1/15,100
2024/1/16,150
](delimiter is ',');
////////////////////
日付期間:
Load
Max(日付) as DateMax,
Min(日付) as DateMin
Resident 売上サンプル;
LET varMaxDate= FieldValue('DateMax', 1);
LET varMinDate= FieldValue('DateMin', 1);
カレンダー:
LOAD
Date($(varMinDate) -1 + IterNo(),'YYYY/MM/DD') as 日付
AutoGenerate 1
While $(varMinDate) -1 + IterNo() <= $(varMaxDate);
▼サンプル②
「売上明細」の件数が多いときにもこのサンプルだと処理が速いとありました。サンプル①にある「日付期間」の部分でかかる時間を大きく改善できるとのことです。
売上サンプル:
LOAD * INLINE
[
日付 ,売上
2024/1/2 ,120
2024/1/3 ,140
2024/1/15,100
2024/1/16,150
](delimiter is ',');
////////////////////
カレンダー:
LOAD
tmp_date as date;
LOAD
Date(mindate + IterNo()) as tmp_date,
maxdate
WHILE mindate + IterNo() <= maxdate;
LOAD
min(FieldValue('日付',RecNo()))-1 as mindate,
max(FieldValue('日付',RecNo())) as maxdate
AutoGenerate FieldValueCount('日付');
【参考】
以上です
Kommentare