はじめに

ここでは、選択条件を適用し、ボタン起動で条件に合致した明細データを「ダイレクト・ディスカバリ(Direct Discovery)」で表示するアプリのデザイン方法についてご説明します。

ダイレクト・ディスカバリはインメモリのデータを利用するのではなく、ビッグデータの膨大なデータなどに対して直接接続を行ってそのデータを分析対象とする機能になります。詳細については以下のエントリをご参照ください。

Qlik Sense 「ダイレクト・ディスカバリ」を使ったビッグデータ分析(前編)

Qlik Sense 「ダイレクト・ディスカバリ」を使ったビッグデータ分析(後編)

QlikView/Qlik Senseでは、以下の形で選択を行うと即時に選択条件が反映されてデータ表示が更新されます。

image

上記において明細テーブルのデータをダイレクト・ディスカバリで取得している場合、選択を行うたびに以下の様なSQLクエリがDBに対して投げられます。

image

場合によっては、このように選択の度に毎回SQLクエリを発行されるのではなく、以下の様にまず選択条件を選択ボックスで選択し、ボタンをクリックするとそのタイミングでのみSQLクエリが発行されて明細テーブルのデータが表示されるような動きの方が望ましい場合があります。

image

ここでは、このようなボタン起動でダイレクト・ディスカバリ経由で明細データ取得を行うアプリの実装方法についてご紹介します。尚、今回作成するアプリのサンプルは以下からダウンロードが可能です。

>>サンプルアプリダウンロード

QlikViewでの実装

ダイレクト・ディスカバリを使った一般的なアプリの実装

ボタン起動での明細データ表示を行うアプリを実装する前に、先ほどご紹介した以下のエントリでご紹介されているような一般的なダイレクト・ディスカバリを使ったアプリの実装をまず見てみたいとと思います。

Qlik Sense 「ダイレクト・ディスカバリ」を使ったビッグデータ分析(前編)

Qlik Sense 「ダイレクト・ディスカバリ」を使ったビッグデータ分析(後編)

以下がここでサンプルとして利用するロードスクリプトになります。


//テーブルボックスの最大表示行数を1000行(デフォルト)に設定
SET DirectTableBoxListThreshold = 1000;

//データベースへの接続 (環境に合わせて要変更)
ODBC CONNECT TO AdWorks (XUserId is EXIaVZFMXB, XPassword is PFCBTYRNJbaCDZMGBZTB);

//明細データのダイレクトテーブル定義(SalesOrderHeaderとSalesOrderDetailのテーブルをJOIN)
DIRECT QUERY
DIMENSION
    AdventureWorks2012.Sales.SalesOrderHeader.SalesOrderID AS SalesOrderID,
    CustomerID,
    SalesPersonID,
    TerritoryID,
    OrderDate,
    ProductID,
    AdventureWorks2012.Sales.SalesOrderDetail.rowguid AS rowguid
MEASURE
    SubTotal,
    TaxAmt,
    TotalDue,
    OrderQty 
FROM AdventureWorks2012.Sales.SalesOrderHeader
JOIN  AdventureWorks2012.Sales.SalesOrderDetail 
ON (AdventureWorks2012.Sales.SalesOrderDetail.SalesOrderID 
 = AdventureWorks2012.Sales.SalesOrderHeader.SalesOrderID); 

//SalesTerritoryテーブルをインメモリに取り込み
LOAD TerritoryID,
    Name AS TerritoryName,
    CountryRegionCode,
    "Group",
    SalesYTD,
    SalesLastYear,
    CostYTD,
    CostLastYear;
SQL SELECT TerritoryID,
    Name,
    CountryRegionCode,
    "Group",
    SalesYTD,
    SalesLastYear,
    CostYTD,
    CostLastYear
FROM AdventureWorks2012.Sales.SalesTerritory;

//Productテーブルをインメモリに取り込み
LOAD  ProductID,
    Name AS ProductName,
    ProductNumber,
    "Color",
    ProductSubcategoryID;
SQL SELECT ProductID,
    Name,
    ProductNumber,
    "Color",
    ProductSubcategoryID
FROM AdventureWorks2012.Production.Product;

上記のロードスクリプトを実行すると、以下の様なデータモデルが作成されます。中心に位置するのが明細データを格納するダイレクト・テーブル(DB上にデータは格納されたままで、ダイレクト・ディスカバリにより直接DBからでデータが取得されるテーブル)で、左右に位置するインメモリに取り込まれたSalesTerritoryとProductのテーブルがそれぞれIDをキーとしてこのダイレクト・テーブルに紐付られています。

image

この様なデータモデルを使って、以下の形でリストボックスとテーブルボックスのチャートを作成した場合、リストボックス選択を行うと即時にテーブルボックスのデータが更新されます。

image

ボタン起動での明細データ表示の実装

では、上記のアプリを修正してボタン起動で明細データを表示するようにしたいと思います。

まず、ロードスクリプトを以下の様に修正します。


//テーブルボックスの最大表示行数を1000行(デフォルト)に設定
SET DirectTableBoxListThreshold = 1000;

//データベースへの接続 (環境に合わせて要変更)
ODBC CONNECT TO AdWorks (XUserId is EXIaVZFMXB, XPassword is PFCBTYRNJbaCDZMGBZTB);

//明細データのダイレクトテーブル定義(SalesOrderHeader,SalesOrderDetail,SalesTerritory,ProductのテーブルをJOIN)
DIRECT QUERY
DETACH
    AdventureWorks2012.Sales.SalesOrderHeader.SalesOrderID AS SalesOrderID,
    CustomerID,
    SalesPersonID,
    AdventureWorks2012.Sales.SalesOrderHeader.TerritoryID AS TerritoryID_DD,
    AdventureWorks2012.Sales.SalesTerritory.Name AS TerritoryName_DD,
    OrderDate,
    AdventureWorks2012.Sales.SalesOrderDetail.ProductID AS ProductID_DD,
    AdventureWorks2012.Production.Product.Name AS ProductName_DD,
    AdventureWorks2012.Sales.SalesOrderDetail.rowguid AS rowguid
MEASURE
    SubTotal,
    TaxAmt,
    TotalDue,
    OrderQty 
FROM AdventureWorks2012.Sales.SalesOrderHeader
JOIN  AdventureWorks2012.Sales.SalesOrderDetail 
ON AdventureWorks2012.Sales.SalesOrderDetail.SalesOrderID 
 = AdventureWorks2012.Sales.SalesOrderHeader.SalesOrderID
LEFT JOIN AdventureWorks2012.Sales.SalesTerritory 
ON AdventureWorks2012.Sales.SalesOrderHeader.TerritoryID
 = AdventureWorks2012.Sales.SalesTerritory.TerritoryID
LEFT JOIN AdventureWorks2012.Production.Product
ON AdventureWorks2012.Sales.SalesOrderDetail.ProductID
 = AdventureWorks2012.Production.Product.ProductID
; 

//SalesTerritoryテーブルをインメモリに取り込み(データアイランド)
LOAD TerritoryID,
    Name AS TerritoryName,
    CountryRegionCode,
    "Group",
    SalesYTD,
    SalesLastYear,
    CostYTD,
    CostLastYear;
SQL SELECT TerritoryID,
    Name,
    CountryRegionCode,
    "Group",
    SalesYTD,
    SalesLastYear,
    CostYTD,
    CostLastYear
FROM AdventureWorks2012.Sales.SalesTerritory;

//Productテーブルをインメモリに取り込み(データアイランド)
LOAD  ProductID,
    Name AS ProductName,
    ProductNumber,
    "Color",
    ProductSubcategoryID;
SQL SELECT ProductID,
    Name,
    ProductNumber,
    "Color",
    ProductSubcategoryID
FROM AdventureWorks2012.Production.Product;

上記では、以下の修正を行っています。

  • ダイレクト・テーブルにJOINでSalesTerritoryとProductのテーブルを結合し、TerritoryName_DD、ProductName_DDの項目を追加しています。
  • TerritoryID、ProductIDをTerritoryID_DD、ProductID_DDに変更し、SalesTerritoryとProductのテーブルをダイレクト・テーブルとは紐付かないデータアイランドとします。
  • MEASURE句をDETAIL句に変更しています(DETAIL句の説明はこちらをご参照ください)。この変更は必須ではないですが、ここでは連想ではなくデータアイランドでのデータの絞り込みを行うため、対象項目を連想から切り離すDETACH句をここでは利用しています。

上記ロードスクリプトの実行の結果、以下の様なSalesTerritoryとProductのテーブルはダイレクト・テーブルとは紐付かないデータアイランドとして定義されたデータモデルが作成されます。

image

テーブルボックスの項目を、ダイレクト・テーブルに含まれるTerritoryID_DD、TerritoryName_DD、ProductID_DD、ProductName_DDの4項目に設定します。

image

アクションボタンを追加し、以下の2つの「項目値選択アクション」を追加します。この設定により、データアイランドのProductIDとTerritoryIDの選択を行い、このボタンをクリックするとその選択条件がそれぞれダイレクト・テーブルに含まれるProductID_DDとTerritoryID_DDに適用されます。

  1. 項目: ProductID_DD 検索文字列: ='(‘&Concat(Distinct ProductID,’|’)&’)’
  2. 項目: TerritoryID_DD 検索文字列: ='(‘&Concat(Distinct TerritoryID,’|’)&’)’

image

では、操作を確認します。まず、ProductNameから「AWC Logo Cap」、TerritoryNameから「Canada」を選択します。この時点ではテーブルボックスには「テーブルボックスの行の制限を超過しました」のメッセージが表示されます。(この制限値はロードスクリプトの「DirectTableBoxListThreshold 」変数により変更することができます。)

image

「選択を適用」ボタンをクリックすると明細データが表示されます。この時初めて裏ではソースDBに対してSQLクエリが実行されていまs。

image

Qlik Senseでの実装

Qlik Senseではバージョン2.1現在では標準ではアクションボタンが提供されていませんが、以下のサイトのエクステンションを利用することでアクションボタンを利用することができます。(ただし、当エクステンションで設定可能なアクション数は2個に制限されています。)

Sheet Navigation + Actions for Qlik Sense

上記サイトからエクステンションをダウンロードし、以下のエントリで説明されている手順に従ってエクステンションの導入を行って下さい。

Qlik Senseを200%活用!チャート・エクステンションの利用

以下の形で「Sheet Navigation & Action」のチャート部品が追加されますので、シートに配置します。

image

「スタイル」>「Actions」の「Actions before navigating」をONにし、QlikViewと同様の形で「Select in Field」の以下の2つのアクションを追加します。

  1. 項目: ProductID_DD 検索文字列: ='(‘&Concat(Distinct ProductID,’|’)&’)’
  2. 項目: TerritoryID_DD 検索文字列: ='(‘&Concat(Distinct TerritoryID,’|’)&’)’

image

QlikViewのアプリを参考にフィルタとテーブルを追加します。先ほどと同様に、ProductNameから「AWC Logo Cap」、TerritoryNameから「Canada」を選択します。

image

「選択を適用」ボタンをクリックすると明細データが表示されます。(QlikViewのテーブルボックスとは異なりQlik Senseのテーブルは軸で集計されるため、テーブルに一意のIDを含むrowguidを追加しています。)

image

まとめ

以上、選択条件を適用し、ボタン起動で条件に合致した明細データを「ダイレクト・ディスカバリ(Direct Discovery)」で表示するアプリのデザイン方法についてご紹介しました。