はじめに
検索した結果を並べ替える際、昇順または降順を指定することと思います。
その際、日付なら過去から現在または現在から過去、数値なら小さい順か大きい順となりますが、文字列の場合はそれぞれの文字に割り当てられたコードによって並び替えがおこなわれます。
例えば、都道府県を北から南に並べ替えたいと思っても、なかなか思ったとおりになりません。
また、製品名を並び替える際にも実際に並び替えたい順番と文字コードを元にした並び替えでは一致しないことも多いと思います。
そこで、文字列を並び替える際に文字列(のコード)ではなく別の列の値を使って並び替える方法を紹介します。
今回の例で言うと、製品名を並び替える際に製品名の代わりに製品コードを使用するイメージです。
これをOracle Analytics Cloud(OAC)では「ソート基準」といいます。
さらに、検索条件を設定する際に別の列の値を使用する設定もおこなってみます。
製品名に対して検索条件を指定すると、OACが自動的にそれに対応する製品コードに対する検索としてクエリを発行してくれるイメージです。
こちらは、OACでは「記述子」といいます。
1. 元々の動作を確認
「製品名」列で表を作成しました。
製品名の文字コードに従って並び替え(昇順)されています。
「製品名」に対して任意のフィルタ条件を設定します。
1.1 開発者オプションを有効にする
右上のアイコンをクリックして、「プロファイル」を開きます。
「拡張」タブに移動し、「開発者オプションの有効化」をオンにします。
「保存」をクリック後、「閉じる」をクリックします。
1.2 発行されるSQLを確認
1.で作成したワークブックを開いた状態で、メニューから「開発者」をクリックします。
「パフォーマンス・ツール」の中の「実行ログ」をクリックし、「リフレッシュ」ボタンをクリックします。
実際に発行されるSQLを確認することができます。
Where句を見ると、PROD_NAMEに対して条件が設定されています。
WITH
SAWITH0 AS (select sum(T35.QUANTITY_SOLD) as c1,
T12.PROD_NAME as c2,
T12.PROD_ID as c3
from
SH.PRODUCTS T12,
SH.SALES T35
where ( T12.PROD_ID = T35.PROD_ID and (T12.PROD_NAME in ('18" Flat Panel Graphics Monitor', '256MB Memory Card', '64MB Memory Card')) )
group by T12.PROD_ID, T12.PROD_NAME)
select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4, D1.c5 as c5 from ( select 0 as c1,
D1.c2 as c2,
cast(NULL as NUMBER ) as c3,
D1.c1 as c4,
D1.c3 as c5
from
SAWITH0 D1 ) D1 where rownum <= 125001
2. 論理列を編集
「記述子」「ソート基準」を設定するには、セマンティック・モデルを構築してある必要があります。
セマンティック・モデルは、従来のWindowsベースのAdministaration Toolか、ブラウザを使用して編集できます。
この記事では、ブラウザを使用してセマンティック・モデルが構築されているものとします。
ハンバーガーメニューから「セマンティック・モデル」をクリックし、目的のセマンティック・モデルをクリックして開きます。
「論理レイヤー」を表示し、先程検索で使用した「製品名」列の元になっている論理列「PROD_NAME」をダブルクリックします。
「ソート基準」に「PROD_NAME」(つまり「製品名」)で並び替えを指示した際に実際に使用される列を指定します。
「記述子列」に「PROD_NAME」にフィルタを設定した際に実際にフィルタリングに使用される列を指定します。
3. セマンティック・モデルをデプロイ
編集内容を保存します。
次に編集した内容でセマンティック・モデルをデプロイします。
スナップショットの取得が推奨されたら、「デプロイ」をクリックするか、一旦中止してスナップショットを取得します。
しばらく待つと、ブラウザのステータスバーに「デプロイに成功しました」と表示されるはずです。
4. 動作確認
念のためにブラウザをリロードするか、再ログインして動作確認します。
「製品名」列を使用して検索後、「製品名」で並び替えをしてみます。
検索結果の文字列の文字コードとは無関係に、製品コードに従って並び替えられ、ソート基準列が機能しているのがわかります。
4.1 発行されるSQLを確認
最初に作ったワークブックからデータを再取得し、その際のSQLを「開発者」メニューで表示させました。
今度は、PROD_NAMEではなくPROD_IDで検索条件が設定されているのがわかり、記述子列が機能していることが確認できました。
WITH
SAWITH0 AS (select sum(T35.QUANTITY_SOLD) as c1,
T12.PROD_NAME as c2,
T12.PROD_ID as c3
from
SH.PRODUCTS T12,
SH.SALES T35
where ( T12.PROD_ID = T35.PROD_ID and (T12.PROD_ID in (21, 136, 138)) and (T35.PROD_ID in (21, 136, 138)) )
group by T12.PROD_ID, T12.PROD_NAME)
select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4, D1.c5 as c5, D1.c6 as c6 from ( select 0 as c1,
D1.c2 as c2,
cast(NULL as NUMBER ) as c3,
D1.c3 as c4,
D1.c3 as c5,
D1.c1 as c6
from
SAWITH0 D1
order by c4 ) D1 where rownum <= 125001