Qlikの日付処理のベクスプラクティス〜第1回 Auto Calendar〜

こんにちは!Yokoです。
皆さん、Qlikでアプリを作成する際、日付はどのように扱っていますか?
例えば、会計年度に合わせたカレンダーとか、前年対比とか…
色んなやり方があると思いますが、僕は長年Qlikを使ってきて、なんとなく固まってきたものを使い回しています。
毎回ほぼコピペです😅
その方法を余すことなくお伝えしていきたいと思います!
ご参考になれば幸いです。

目次

初期設定の日本語対応

Qlik Cloud Analytics(最近はこう呼ぶらしい)はグローバル対応なので、デフォルトは英語圏の表記になっています。
Jan, Feb・・・と表示されても直感的にわかりにくいですよね。
データロードエディタで作成する時にLocaleを選択して、Localeに合わせて作成してくれるとありがたいんだけどなあ…と思うのは僕だけでしょうか?
おそらく、皆さんはこういう風に初期設定を入れ替えているんだろうなと思います。

SET ThousandSep=',';
SET DecimalSep='.';
SET MoneyThousandSep=',';
SET MoneyDecimalSep='.';
SET MoneyFormat='¥#,##0;-¥#,##0';
SET TimeFormat='h:mm:ss';
SET DateFormat='YYYY/MM/DD';
SET TimestampFormat='YYYY/MM/DD h:mm:ss[.fff]';
SET FirstWeekDay=6;
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET FirstMonthOfYear=1;
SET CollationLocale='ja-JP';
SET CreateSearchIndexOnReload=1;
SET MonthNames='1月;2月;3月;4月;5月;6月;7月;8月;9月;10月;11月;12月';
SET LongMonthNames='1月;2月;3月;4月;5月;6月;7月;8月;9月;10月;11月;12月';
SET DayNames='月;火;水;木;金;土;日';
SET LongDayNames='月曜日;火曜日;水曜日;木曜日;金曜日;土曜日;日曜日';
SET NumericalAbbreviation='3:k;6:M;9:G;12:T;15:P;18:E;21:Z;24:Y;-3:m;-6:μ;-9:n;-12:p;-15:f;-18:a;-21:z;-24:y';

データの準備

今回は、日付処理のサンプルを作成するために、以下のようなサンプルデータを準備しました。
食料品のスーパーマーケットのオリジナルのデータとなります。
必要な方はこちらからダウンロードできます。

データのロード

サンプルデータをロードするスクリプトを以下のように作成します。
すべてシンプルにロードするスクリプトを作成するだけです。

売上:
LOAD
    売上日,
    店舗ID,
    顧客ID,
    伝票番号,
    商品コード,
    数量,
    売上金額,
    原価
FROM [lib://<path>/売上_2024.csv]
(txt, utf8, embedded labels, delimiter is ',', msq);

LOAD
    売上日,
    店舗ID,
    顧客ID,
    伝票番号,
    商品コード,
    数量,
    売上金額,
    原価
FROM [lib://<path>/売上_2025.csv]
(txt, utf8, embedded labels, delimiter is ',', msq);


商品:
LOAD
    商品コード,
    カテゴリコード,
    商品名,
    カテゴリ名,
    単価
FROM [lib://<path>/商品.csv]
(txt, utf8, embedded labels, delimiter is ',', msq);

顧客:
LOAD
    顧客ID,
    性別,
    生年月日,
    都道府県,
    市区町村,
    登録日,
    有効フラグ
FROM [lib://<path>/顧客.csv]
(txt, utf8, embedded labels, delimiter is ',', msq);

店舗:
LOAD
    店舗ID,
    店舗名,
    店舗タイプ,
    店舗都道府県,
    店舗市区町村
FROM [lib://<path>/店舗.csv]
(txt, utf8, embedded labels, delimiter is ',', msq);

データをロードするとこんなデータモデルが出来上がります。
特に何も加工しなくても、テーブル間の関連付けができるようにしてあります。

Auto Calendarを組み込む

準備ができたところで、いよいよAuto Calendarを組み込んでいきます。
今回のAuto Calendarでは、通常の西暦年だけではなく、会計年度にも対応させますので、会計年度の開始月をvFYStartMonthで定義しておくことにします。

Let vFYStartMonth = 4;

この例では4月が会計年度の開始月となります。
そして、[fiscal]と[calendar]の二種類のカレンダーを作成します。
このカレンダーを作成する時は色々考えたのですが、今は何も考えずにコピペで済ませていますので、皆さんも何も考えずにコピペして下さい😄

//会計年度の開始月
Let vFYStartMonth = 4;

//会計年度対応
[fiscal]: 
DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS
	Dual(Year(Addmonths($1,1-$(vFYStartMonth))),YearStart($1,0,$(vFYStartMonth)))  AS [Year] Tagged ('$axis', '$year'),
    'Q' & Ceil(Month(Addmonths($1,1-ADD$(vFYStartMonth)))/3) AS [Quarter] Tagged ('$axis','$quarter','$cyclic'),
	Dual(Year(Addmonths($1,1-$(vFYStartMonth))) & '-Q' & Ceil(Month(Addmonths($1,1-$(vFYStartMonth)))/3),QuarterStart($1,0,$(vFYStartMonth))) AS [YearQuarter] Tagged ('$axis', '$yearquarter'),
    Dual(Month($1),
    	If(Month($1)>=$(vFYStartMonth),Month($1)-$(vFYStartMonth)+1,
        	Month($1)-$(vFYStartMonth)+13)) AS [Month] Tagged ('$axis','$month','$cyclic'),      	
 	Dual(Year($1)&'-'&Month($1), monthstart($1)) AS [YearMonth] Tagged ('$axis', '$yearmonth', '$qualified'),
    Dual(Month($1), monthstart($1)) AS [_YearMonth] Tagged ('$axis', '$yearmonth', '$simplified', '$hidden'),
	Dual(
		'W' & Num(Week($1,0),'00')
		,If(
			 Month($1)>=$(vFYStartMonth)
			,Week($1,0)-Week(YearStart($1,$(vFYStartMonth)),0)+1	
			,Week($1,0)+Week(YearEnd($1,13+$(vFYStartMonth)),0)+1
		)
	) AS [Week] Tagged ('$axis','$weeknumber','$cyclic'),
	Date(WeekStart(Addmonths($1,0),0,0)) AS [WeekStart] Tagged ('$axis','$weekstart','$cyclic'),
	Year($1) & 'W' & Num(Week($1,0),'00') AS [YearWeek] Tagged ('$axis','$yearweek','$qualified'),
	WeekDay($1) AS [Weekday] Tagged ('$axis','$weekday','$cyclic'),
    Dual(Num(Month($1),'00') & '/' & Num(Day($1),'00'),
    	Month(Addmonths($1,1-$(vFYStartMonth)))*100+Day(Addmonths($1,0))) AS [MonthDay] Tagged ('$axis','$monthday','$cyclic'),
    Date(Floor($1)) AS [Date] Tagged ('$axis', '$date','$qualified'),
    Day($1) + weekday(MonthStart($1)) As [CalendarPosition] Tagged ('$axis','$weekday','$cyclic');
DERIVE FIELDS FROM FIELDS 
売上日
USING [fiscal];

//カレンダー対応
[calendar]: 
DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS
	Dual(Year(Addmonths($1,0)),YearStart($1,0,1))  AS [Year] Tagged ('$axis', '$year'),
    Dual(Month($1),Month(Addmonths($1,0))) AS [Month] Tagged ('$axis','$month','$cyclic'),
 	Dual(Year($1)&'-'&Month($1), monthstart($1)) AS [YearMonth] Tagged ('$axis', '$yearmonth', '$qualified'),
    Dual(Month($1), monthstart($1)) AS [_YearMonth] Tagged ('$axis', '$yearmonth', '$simplified', '$hidden'),
	Dual(
		'W' & Num(Week($1,0),'00')
		,If(
			 Month($1)>=$(vFYStartMonth)
			,Week($1,0)-Week(YearStart($1,$(vFYStartMonth)),0)+1
			,Week($1,0)+Week(YearEnd($1,13+$(vFYStartMonth)),0)+1
		)
	) AS [Week] Tagged ('$axis','$weeknumber','$cyclic'),
	Date(WeekStart(Addmonths($1,0),0,0)) AS [WeekStart] Tagged ('$axis','$weekstart','$cyclic'),
	Year($1) & 'W' & Num(Week($1,0),'00') AS [YearWeek] Tagged ('$axis','$yearweek','$qualified'),
	Dual(Num(Month($1),'00') & '/' & Num(Day($1),'00'),
    	Month(Addmonths($1,0))*100+Day($1))AS [MonthDay] Tagged ('$axis','$monthday','$cyclic'),
	Date(Floor($1)) AS [Date] Tagged ('$axis', '$date','$qualified'),
    Day($1) + weekday(MonthStart($1)) As [CalendarPosition] Tagged ('$axis','$weekday','$cyclic');
DERIVE FIELDS FROM FIELDS 
売上日
USING [calendar];

コピペが終わったら、直すのはココだけです。

【31〜33行目】
DERIVE FIELDS FROM FIELDS と USING [fiscal] の間に日付項目を追加します。ここでは売上日ですが、皆さんのデータの日付を入れてもらえれば結構です。
日付項目が多い場合ですが、カンマで区切って追加してもらえれば、カレンダー項目になります。

DERIVE FIELDS FROM FIELDS
売上日
USING [fiscal];

57〜59行目も同様です(ここでは省略)。

カレンダーの確認

データをリロードすると、Auto Calendarで定義した日付項目には、Year, YearMonth, Month …のような派生項目ができます。アセットパネルで項目を表示すると以下のように表示されるはずです。

このように「売上日」の下に派生項目として、Year, Quarter, YearQuarter, Month, YearMonth …と表示されます。
同じ派生項目が二度出てくるのは、Auto Calendarで[fiscal]と[calendar]の2つのカレンダーを定義したためです。最初に出てくるのが fiscalですね。

Auto Calendarで定義した派生項目がどのように表示されるか見てみましょう。
(CalendarPositionは、ここではわからないかもしれませんが、このシリーズのどこかで使用例を解説しますね)

2つのカレンダーで棒チャートを作成し、月の並びを見てみましょう。
fiscal(会計年度)の時は4月、calendar(西暦年)の時は1月から並んでいるのが確認できました。

まとめ


今回は「Qlikの日付処理のベクスプラクティス」第1回めとして、Auto Calendarのスクリプトを紹介しました。
Auto Calendarを使用すると以下のようなメリットがあります。

  • DERIVE FIELDS FROM FIELDS <日付項目> USING <カレンダー名>にセットするだけで、カレンダー処理ができる
  • 複数の日付項目をAuto Calendarで設定できる
  • 会計年度にも簡単に対応できる

それ以外に、ダッシュボードを作成する際にも色んなワザが使えます。
どんどんコピペしちゃって下さい。
ではまた!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次