Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
kyoden_naoyuki
Contributor III
Contributor III

linktableの作成方針について

2つのファクトテーブルを日付で関連付けしたいのですが、

単純に連携させただけではうまくいきませんでした。

 

しかし、Linktableであれば解決できる可能性があるように見受けられたので、

3つ添付しているCSVで自分で見よう見まねで試してみたのですが、

循環参照になってしまい、思い通りの分析ができません。

 

CSVの概要としては

打刻実績:ファクトテーブル・・・氏名,勤務年月日がある

ログオン実績:ファクトテーブル・・・ログイン名,ログオン年月日がある

ユーザー情報マスタ:ディメンションテーブル・・・ログイン名,氏名がある

でLinkTableで氏名+勤務年月日をkeyとして氏名や日付で分析をしたいのです。

 

問題となっているスクリプトのあるqvfファイルを添付するので、

どこが問題なのかご教示いただきたいです。

 

大変お手数をおかけいたしますが、

ご教示のほどよろしくお願いいたします。

9 Replies
kyoden_naoyuki
Contributor III
Contributor III
Author

xlsxを添付いたします。

kentaroWakamatsu
Creator II
Creator II

添付のようなテーブル構成はいかがでしょうか?

「勤務年月日」は、LinkTable側でも良いと思います。

また、「氏名」は同一の場合も考えられるので、キーに利用するのは「従業員ID」の方が良いとおもいます。

現在QVの環境しかないのでQVのスクリプトですが、QSでも利用できると思うので、スクリプトのサンプル記載しておきます。

:::::::::::::::::::::::::::::::::

Directory;
ユーザー情報マスタ:
LOAD 従業員ID,
ログイン名,
氏名
FROM
ユーザー情報マスタ.xlsx
(ooxml, embedded labels, table is ユーザー情報マスタ);

ログオン実績_WORK:
LOAD ログオンユーザー,
ログオン年月日,
初回ログオン時刻,
最終ログオフ時刻,
ログイン名
FROM
ログオン実績.xlsx
(ooxml, embedded labels, table is ログオン実績);
Left Join
LOAD ログイン名,
従業員ID
Resident ユーザー情報マスタ;

ログオン実績:
LOAD 従業員ID&'_'&Date(ログオン年月日,'YYYYMMDD') as Key,
初回ログオン時刻,
最終ログオフ時刻
Resident ログオン実績_WORK;
DROP Table ログオン実績_WORK;

打刻実績_WORK:
LOAD 氏名,
勤務年月日,
[出勤時間(実績)],
[退勤時間(実績)]
FROM
打刻実績.xlsx
(ooxml, embedded labels, table is 打刻実績);
Left Join
LOAD 氏名,
従業員ID
Resident ユーザー情報マスタ;

打刻実績:
LOAD 従業員ID&'_'&Date(勤務年月日,'YYYYMMDD') as Key,
勤務年月日,
[出勤時間(実績)],
[退勤時間(実績)]
Resident 打刻実績_WORK;
DROP Table 打刻実績_WORK;

Linktable:
LOAD Distinct
Key,
SubField(Key,'_',1) as 従業員ID
Resident ログオン実績;
Concatenate
LOAD Key,
SubField(Key,'_',1) as 従業員ID
Resident 打刻実績;

 

kyoden_naoyuki
Contributor III
Contributor III
Author

ご教示いただきありがとうございます。

こちらのスクリプトで試してみたのですが、

私の説明が不足しており、上手く動作しませんでした。

 

具体的には、

打刻実績とログオン実績、それぞれの勤務年月日とログオン年月日が同じ日の

[出勤時間(実績)]と初回ログオン時刻、[退勤時間(実績)]と最終ログオフ時刻

の差分をユーザー毎に取りたいです。

 

しかし、画像のように勤務年月日に対して、[出勤時間(実績)]は1対1であって、

例えば、氏名を山田 太郎、勤務年月日2018/8/1絞り込んだ場合、

であれば9:00と出ます。

 

しかし、初回ログオン時刻が本来であれば8:58の一つだけが

表示されるようになっていなければならないのですが、

それ以外に17個表示されています。

 

この数はログオン実績の山田 太郎で絞り込んだ際の

ログオン年月日の入力データ数と同じです。

これを解決するにはkeyをどのように設定すればよろしいでしょうか?

ご教示のほどよろしくお願いいたします。

 

kentaroWakamatsu
Creator II
Creator II

先程記載させていただいたスクリプトの内容を実行し、添付させていただいたテーブル構成になると添付ファイルのような集計結果になるはずです。

よければ、記載されているスクリプトを転記いただけますか?

kyoden_naoyuki
Contributor III
Contributor III
Author

返信が遅くなり、誠に申し訳ございません。

実際にはCSVファイルだったので、Wakamatsu様のコードをxlsxに変更して、

下記のようにしております。

---------------------------------------------------------------------------------------------

Directory;
ユーザー情報マスタ:
LOAD 従業員ID,
ログイン名,
氏名
FROM [lib://AttachedFiles/ユーザー情報マスタ.csv]
(txt, codepage is 932, embedded labels,table is ユーザー情報マスタ, delimiter is ',', msq);

ログオン実績_WORK:
LOAD ログオンユーザー,
ログオン年月日,
初回ログオン時刻,
最終ログオフ時刻,
ログイン名
FROM [lib://AttachedFiles/ログオン実績.csv]
(txt, codepage is 932, embedded labels,table is ログオン実績, delimiter is ',', msq);

Left Join
LOAD ログイン名,
従業員ID
Resident ユーザー情報マスタ;

ログオン実績:
LOAD 従業員ID&'_'&Date(ログオン年月日,'YYYYMMDD') as Key,
初回ログオン時刻,
最終ログオフ時刻
Resident ログオン実績_WORK;
DROP Table ログオン実績_WORK;

打刻実績_WORK:
LOAD 氏名,
勤務年月日,
[出勤時間(実績)],
[退勤時間(実績)]
FROM [lib://AttachedFiles/打刻実績.csv]
(txt, codepage is 932, embedded labels,table is 打刻実績, delimiter is ',', msq);
Left Join
LOAD 氏名,
従業員ID
Resident ユーザー情報マスタ;

打刻実績:
LOAD 従業員ID&'_'&Date(勤務年月日,'YYYYMMDD') as Key,
勤務年月日,
[出勤時間(実績)],
[退勤時間(実績)]
Resident 打刻実績_WORK;
DROP Table 打刻実績_WORK;

Linktable:
LOAD Distinct
Key,
SubField(Key,'_',1) as 従業員ID
Resident ログオン実績;
Concatenate
LOAD Key,
SubField(Key,'_',1) as 従業員ID
Resident 打刻実績;

 


[autoCalendar]:
DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS
Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis', '$year'),
Dual('Q'&Num(Ceil(Num(Month($1))/3)),Num(Ceil(NUM(Month($1))/3),00)) AS [Quarter] Tagged ('$quarter', '$cyclic'),
Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [YearQuarter] Tagged ('$yearquarter', '$qualified'),
Dual('Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [_YearQuarter] Tagged ('$yearquarter', '$hidden', '$simplified'),
Month($1) AS [Month] Tagged ('$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),00), Num(Week($1),00)) AS [Week] Tagged ('$weeknumber', '$cyclic'),
Date(Floor($1)) AS [Date] Tagged ('$axis', '$date', '$qualified'),
Date(Floor($1), 'D') AS [_Date] Tagged ('$axis', '$date', '$hidden', '$simplified'),
If (DayNumberOfYear($1) <= DayNumberOfYear(Today()), 1, 0) AS [InYTD] ,
Year(Today())-Year($1) AS [YearsAgo] ,
If (DayNumberOfQuarter($1) <= DayNumberOfQuarter(Today()),1,0) AS [InQTD] ,
4*Year(Today())+Ceil(Month(Today())/3)-4*Year($1)-Ceil(Month($1)/3) AS [QuartersAgo] ,
Ceil(Month(Today())/3)-Ceil(Month($1)/3) AS [QuarterRelNo] ,
If(Day($1)<=Day(Today()),1,0) AS [InMTD] ,
12*Year(Today())+Month(Today())-12*Year($1)-Month($1) AS [MonthsAgo] ,
Month(Today())-Month($1) AS [MonthRelNo] ,
If(WeekDay($1)<=WeekDay(Today()),1,0) AS [InWTD] ,
(WeekStart(Today())-WeekStart($1))/7 AS [WeeksAgo] ,
Week(Today())-Week($1) AS [WeekRelNo] ;

DERIVE FIELDS FROM FIELDS [勤務年月日], [ログオン年月日] USING [autoCalendar] ;

kentaroWakamatsu
Creator II
Creator II

カレンダーの前部分の記述は問題ないと思いますが、QVで

 ・DECLARE FIELD 

 ・DERIVE FIELDS

の記述が無いので、動作が正確にわからないため、このスクリプトで出来上がったテーブル構成のキャプチャ添付してもらえますか?

kyoden_naoyuki
Contributor III
Contributor III
Author

データモデルビューアの構成は添付画像のようになります。

一見すると、Wakamatsu様のQVの画像と同じようになっていると思うのですが、

いかがでしょうか?

kentaroWakamatsu
Creator II
Creator II

QlikSenceでも作ってみましたが、特に問題なくリレーションははれているようです。

サンプル添付しておきます。

一度確認してみて下さい。

kentaroWakamatsu
Creator II
Creator II

あくまで添付いただいた集計結果からの想像ですが、ひょっとしたら元データが日付情報として認識できておらず、項目「Key」が正しく出来てないのではないでしょうか?

添付したファイルでは、

 ・前6桁に「従業員ID」

 ・アンダーバー

 ・後ろ8桁が'YYYYMMDD'の日付情報

で出来ていて、'123456_20180801’ といった値が作成されていると思います。

これが '123456_' といった形になっているかもしれないので、一度お持ちのファイルの「Key」を確認してみて下さい。