お問い合わせ
5 分で読むことができます。

【Qlik Sense】Generic Loadを使用した列から行への変換方法

2025年2月10日

目次

はじめに

Qlik Senseにはデータのロードや変換を支援する複数のプレフィックスがあります。Qlik Senseのプレフィックスの一つに、Genericプレフィックスがあります。この機能を活用することで、通常のクロステーブル変換(CrossTable Load)とは逆の処理を行い、縦型のデータを横型に変換できます。本記事では、Generic Loadの基本概念、その実装方法、さらに動的にテーブルを統合する方法について詳しく解説します。

 

Generic Loadとは?

汎用データベース(generic database)がある場合、Genericプレフィックスを使用することでデータを変換し、必要なフィールドを作成できます。

※汎用データベースとは、基本的に最後から2番目の列が任意の属性(Attribute)であり、最後の列がその属性の値(Value)であるようなテーブルのことを指します。以下の入力テーブルのように、3列の構成になっているのが一般的です。

エンティティ 属性
1 身長 170
1 体重 60
1 性別
2 身長 180
2 体重 75
2 性別

 

データ変換の必要性

このようなデータを分析する場合、一つの列にすべての属性値が含まれていると、異なる属性を同時に使って選択を行うのが困難になります。(例えば身長が○○で体重が××というデータの絞り込みなど。)

ここで役立つのが Genericプレフィックス です。

各属性と対応する値ごとに個別のテーブルを作成することで、分析をしやすくします。

 

Genericプレフィックスの仕組み

先にも述べましたが、このプレフィックスを使用すると、各属性が独自の列として配置される構造にデータを変換できます。言い換えれば、属性列のフィールドの値を列名に変換する処理を行います。

Crosstableプレフィックスとは逆の関係にあると考えると理解しやすいでしょう。

構文は以下の通りです。

Generic( Loadstatement | Selectstatement )                     

 

Generic Loadの基本的な実装

1. 基本的なデータロード

まずは、データロードエディタに以下のスクリプトを挿入します。

Data:
LOAD * INLINE [
エンティティ, 属性, 値
1, 身長, 170
1, 体重, 60
1, 性別, 男
2, 身長, 180
2, 体重, 75
2, 性別, 男
];


[データのロード]を行い、
作成されるテーブルをデータモデルで確認すると以下であることが確認できます。

 

2. Generic Loadの適用

次に、先ほど作成したテーブルに対して、Generic Load を行ってみます。

GenericData:
Generic LOAD * Resident Data;
 

このコードを実行すると、以下のように「属性」の異なる値ごとに別々のテーブルを生成し、「GenericTable.身長」、「GenericTable.体重」、「GenericTable.性別」が作成されます。

テーブル名に含まれる「GenericTable.」はGeneric LOAD時のテーブル名が修飾子として自動的に付与されるためです

 

注意点

通常、入力データは以下の3列構成であるべきです。

  1. 識別キー(例:Key
  2. 属性(Attribute
  3. 値(Value

しかし、**複数の識別キーがある場合(4列以上)**は、最後の2列以外のすべてが識別キーとして扱われます。

また、Genericプレフィックスは、属性ごとに別々のテーブルを作成しますが、これは問題ではなく、むしろメモリ使用量を最適化する方法として有効です。

 

複数キーの場合

複数の識別キーがあると、合成キー(Synthetic Key)が生成されることになります。

この合成キーは見た目は複雑ですが、基本的に無害です。ただし、手動で結合キーを作成して管理する方が適切な場合があります。

Autonumber(Key1 & '|' & Key2) as Key,

このようにAutonumberを使って一意のキーを作成することで、データモデルの可読性を向上できます。

 

生成されたテーブルを動的に統合する

生成されたテーブルを1つに統合したい場合、以下のように For-Next のループを使用することで統合することができます。

Data:
LOAD * INLINE [
エンティティ, 属性, 値
1, 身長, 170
1, 体重, 60
1, 性別, 男
2, 身長, 180
2, 体重, 75
2, 性別, 男
];
 
//Generic Load
GenericData:
Generic LOAD * Resident Data;
 
//Generic Load で作成されたテーブルの一覧を作成
For i = 0 to NoOfTables()
    Let vTableName = TableName($(i));
    
    If SubField(vTableName,'.',1) = 'GenericData' then
    
        GenericTableList:
        Load '$(vTableName)' as TableName AutoGenerate 1;
    
    End If;
 
Next
 
 
//元テーブルからユニークなキーを取得
CombinedGenericTable:
Load Distinct エンティティ Resident Data;
 
//ユニークなキーにGenericで生成されたテーブルをJoin したらDrop
For i = 1 to NoOfRows('GenericTableList')
 
    LET vTableName = FieldValue('TableName',$(i));
 
    Left Join(CombinedGenericTable)
    Load * Resident [$(vTableName)];
    Drop Table [$(vTableName)];
 
Next
 
//不要なテーブルを削除
Drop Table Data,GenericTableList;
 
 
 

まとめ

Genericプレフィックスは、データを最適に格納するための仕組みです。
通常はそのまま利用し、データ変換が必要な場合のみ統合処理を行うべきです。どうしても統一テーブルが必要な場合には、上記のスクリプトを使用できますが、パフォーマンスやメモリ使用量に注意が必要です。

 

参考情報

Kaz

Written by Kaz

Qlik_No1_2022
QSナレッジ事例バナー
DXバナー
Qlikseminar
qs_trial
Qllikseminar
Vizlibナレッジ
Vizlibセミナー
qv_knowledge
book_kawaii
Snowflake_バナー

新着記事

タグ別の記事

全て表示