クロス集計のファクトの両端に文字列を付加する【Cognos Analytics】


### 概要
クロス集計やリストの数値に、例えば()をつけたいときがあります。例としては、総人数のうち女性の人数を()内に記載することや、消費税表示をする場合などで見られます。
本記事では、()で囲みたい数値データを持つクエリーを定義し、そのクエリーからの値を参照する場合に()を付加する手順をご紹介します。
完成イメージはこちら↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/4293a204-cffa-b0d0-43b6-37c24e54963e.png)



各年での製品毎の収益を出力するレポートで、総収益のうちプロモーションによって売れた金額を()内に表記するようにします。
作成するクロス集計表の構造としては以下です。

|    |  集計年  |
| ---- | ---- |
|  製品名  |  総収益  |
|  "(キャンペーン実績)"  |  ([キャンペーンでの収益金額])  |

### 手順
1つ目の作例と同一のデータソース「GOデータウェアハウス（クエリー）」を選択。
クエリーを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/f7101d20-5bd4-9936-81fe-52f0dd768607.png)
クエリー名「全体販売実績」として、下記データアイテムをデータソースよりドラッグアンドドロップ
* 年
~~~
[販売 (クエリー)].[時間].[年]
~~~
* 基本製品キー
~~~
[販売 (クエリー)].[製品].[基本製品キー]
~~~
* 製品
~~~
[販売 (クエリー)].[製品].[製品]
~~~
* キャンペーンコード
~~~
[販売 (クエリー)].[プロモーション].[キャンペーン コード]
~~~
* 収益
~~~
[販売 (クエリー)].[販売の実状].[収益]
~~~

これで、プロモーションの有無に依らず年別の製品毎の収益を出力するクエリーが作成できました。
出来上がりイメージのインデックス列では、単に「製品名」だけでなく、製品名の行の下に「（キャンペーン実績）」が出力されます。このためインデックス列用のデータアイテムを用意します。
この行では製品での総収益を出力するため、インデックス列には製品名そのままで定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/22b1e298-69bb-f48c-7201-2946d8ca686b.png)

また、後にキャンペーン有りのクエリーとユニオンするため、製品順に行を並べるため、ソートキーを定義します。
lpad関数は基本製品キーを3桁の文字列にし、基本製品キーが例えば1であれば001と変換するために使用しています。
キャンペーンに依らずすべての収益を出力する行であるため、末尾をAとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/db0f8e99-5715-53af-e5c2-9f165df65655.png)

続いて、キャンペーンがあった場合での製品別収益を持つクエリーを作成します。
先程作成した「全体販売実績」クエリーをコピーしクエリー画面に貼り付け。
詳細フィルターにて下記を追加。
~~~
[販売 (クエリー)].[プロモーション].[キャンペーン コード] <> 50
~~~
ソートキーの式の定義を下記で上書き
~~~
lpad([販売 (クエリー)].[製品].[基本製品キー],3,'0') || 'P'
~~~
インデックス列の式の定義を下記で上書き
~~~
'(キャンペーン実績)'
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/8076b627-e829-c510-5f75-67a4a1f9dff7.png)

ここまでで、全体の販売実績をもつクエリーと、キャンペーンでの収益に絞られたクエリーの2つが完成しました。これらをユニオンして別の行として出力する準備をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/52dff784-0aaa-aa99-8cad-97d9a91fc626.png)

挿入できるオブジェクトから「結合 (Union)」をドラッグアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/8c7d5fcb-22ba-1526-91a9-ea854fa409a9.png)

これまで作成した2つのクエリーを結合対象とし、新規にできるクエリーの名前をResultと設定
挿入できるオブジェクトのソースタブから全データアイテムをドラッグアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/46d261b0-d99d-cbe0-a70d-b1d8073f27bb.png)

この時点でクエリーを実行し、ソートキーを昇順とすると↓
製品名、製品のキャンペーン実績の順に並べられているが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/98da7380-2005-f97a-a34c-99b0ab117c9c.png)

ここまででクエリーの編集作業は完了です。レポート画面を編集していきます。
ページ1にクロス集計を配置し、クエリーはResultを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/13900e70-73fe-290a-9151-c7199bfb7eab.png)

まず、後続の作業のため、プロパティー左横の三点リーダー「...」からビジュアルエイド＞視覚補助の有効化を選択してすべての視覚補助を有効化してください。これは、後にボックスのタイプをなしとしても表示を維持するためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/53613749-adbe-d53b-4397-73fa3c4a7ba6.png)

クロス集計の行にインデックス列、列に年、クロス集計の交点には収益を、Resultクエリーからドラッグアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/25f430e4-86a0-52af-7b9d-fb1054bf30d4.png)

列のソートには「年」を昇順に指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/fd972b43-29a9-28d1-c3c2-f360812f72c5.png)

行のソートには「ソートキー」を昇順に指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/4e40f17f-a5e9-21ed-f954-78036d794101.png)

この時点でレポートを実行すると↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/94dc44e0-4906-0194-a75e-263ed1fba088.png)
(キャンペーン実績)が1行にのみ出力され、収益の金額が他より大きいことがわかります。これは、複数レコードであっても軸の内容が同一である場合にCognosが自動で集計をするためです。

これを回避するため、粒度の異なる軸を配置します。


基本製品キーをインデックス列の左に挿入、ボックスのタイプを「なし」に指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/f2abf498-876f-23ed-e292-3f342f7ad835.png)

本記事の主目的である「ある区分に当てはまるとき数値を文字列で囲む」処理をします。
クロス集計の交点のロックを解除した状態で、テーブルをドラッグアンドドロップ。テーブルは3列1行と設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/23369b73-16cf-7070-e8ee-1f9e0a52cea2.png)

収益データアイテムを3列の中心に配置。表のセルの水平配置を「中央」にセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/037ed89b-ea44-d87a-a1e1-bb8887a41a66.png)

テキスト・アイテムをテーブルの左セルにドロップ。今回はキャンペーン実績額を()で囲むため、"("でOK。テーブルの右セルも同様にして")"とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/4aa457f5-e8f5-1bde-1fbb-f3d5cfb39322.png)

ファクトの軸の区分により括弧書きを付加するため、"()"のテキスト・アイテムを選択し、条件付きスタイル>詳細な条件付きスタイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/c908ad26-8b5b-a031-764d-16754b19f6aa.png)

「通常販売」として条件付きスタイルを作成、「＋」を選択して下記内容の式の定義を入力。
~~~
[Result].[キャンペーン コード] = 50
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/2408517e-d4fa-5bd6-09d7-2f0997ae6c27.png)

「スタイルを編集」から、詳細設定タブの表示を「いいえ」に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/7aa68a83-4d80-9d46-66a4-d8bce6a799d9.png)

また、Cognosのレポート実行時に、ページ内レイアウトに無いプロパティー(ここでは「キャンペーンコード」)を条件付きスタイルなどの式の定義にしようするとエラーとなります。そのため、クロス集計の行を選択し、プロパティーにて「「キャンペーンコード」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/e8f4ab8a-5f1b-1b9d-b1d5-ceb112c04d9a.png)

これによって、キャンペーンありの場合に収益を括弧で囲み出力することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255563/811b9d7f-622e-16ec-c86f-8b0154b47053.png)

なお、このレポート出力には「ボックスのタイプ」を「なし」にしたことによりレイアウト上の問題があります。
2010年～2013年のクロス集計のヘッダ部分が右にずれてしまっていますね。この問題の解決方法を、「クロス集計スペーサー」によって解決することができます。
別の記事にて、この手順を解説しています。
https://qiita.com/i_toma/items/35bc7a8279afc70dbe8a