Foren: Hilfe (Thread #6401)

数値型でソートできない (2004-11-16 20:00 by user03 #11881)

数値型の項目をソートキーとして設定したオブジェクトを作成しても文字型としてソートされてしまいます。
数値順にソートできないでしょうか?

例:A ソートキー=1
  B ソートキー=2
  C ソートキー=10

  はA→B→C ではなくA→C→Bと表示される。
  (※ソートキーにしている項目はテーブルではint型)

RE: 数値型でソートできない (2004-11-19 16:37 by miyamo #11906)

いつもお世話になっております。
miyamoと申します。

申し訳ありませんがGUIでの操作では、対応できないので、
Postgres内で管理しているディメンション用のテーブルの型を変更する
方法で対応願えればと思います。


1.ソートカラムに数値型を指定しているディメンションのIDを調べる。
→Designer→ディメンション→該当するディメンション画面の「ディメンションID」の項目
2.そのディメンションをカスタマイズしていれば、パーツIDを調べる。
(カスタマイズしていなければ、1)
→Designer→ディメンションのカスタマイズ→該当するディメンションの画面の「パーツID」の項目

psql等で、OpenOLAPのメタDatabaseに接続し、
OpenOLAPのディメンションテーブル(oo_dim_ディメンションID_パーツID)を
以下のように、型変更し、int型のsort_colを作成する。
※Postgresには型変更コマンドがないので、add→drop→addしています。

ここでは、
・ディメンションID=10
・パーツID=1
を想定しているので、
oo_dim_10_1
のテーブルとなっている。
※調査したディメンションID、パーツIDにあわせて書き換えてください。

alter table oo_dim_10_1 add sort_col2 integer;
update oo_dim_10_1 set sort_col2 = to_number(sort_col,'99999999999');

alter table oo_dim_10_1 drop column sort_col;
alter table oo_dim_10_1 add column sort_col integer;

update oo_dim_10_1 set sort_col = sort_col2;
alter table oo_dim_10_1 drop column sort_col2;


******************変更前********************
openolap=# \d oo_dim_10_1
Table "oo_meta.oo_dim_1_1"
Column | Type | Modifiers
-----------------+------------------------+-----------
key | integer | not null
par_key | integer |
col_1 | character varying(50) |
col_2 | character varying(50) |
col_3 | character varying(50) |
col_4 | character varying(50) |
col_5 | character varying(50) |
col_6 | character varying(50) |
sort_col | character varying(256) |
code | character varying(256) |
short_name | character varying(256) |
long_name | character varying(256) |
calc_text | character varying(256) |
time_date | date |
org_level | numeric(2,0) |
cust_level | numeric(2,0) |
leaf_flg | character(1) |
kind_flg | character(1) |
name_update_flg | character(1) |
min_val | numeric(10,2) |
max_val | numeric(10,2) |

******************変更後********************
openolap=# \d oo_dim_10_1
Table "oo_meta.oo_dim_10_1"
Column | Type | Modifiers
-----------------+------------------------+-----------
key | integer | not null
par_key | integer |
col_1 | character varying(50) |
col_2 | character varying(50) |
col_3 | character varying(50) |
col_4 | character varying(50) |
col_5 | character varying(50) |
col_6 | character varying(50) |
code | character varying(256) |
short_name | character varying(256) |
long_name | character varying(256) |
calc_text | character varying(256) |
time_date | date |
org_level | numeric(2,0) |
cust_level | numeric(2,0) |
leaf_flg | character(1) |
kind_flg | character(1) |
name_update_flg | character(1) |
min_val | numeric(10,2) |
max_val | numeric(10,2) |
sort_col | integer |

※ディメンションを削除しない限り、上記テーブルは消えないので、
一度変更すれば、以後Numberでソートされます。

以上です。


Reply to #11881

RE: 数値型でソートできない (2004-11-19 17:08 by miyamo #11908)

いつもお世話になっております。
miyamoと申します。

すいません。テスト不十分で別の場所でエラーがでますので、上記方法は無視してください。別途方法を載せますので、よろしくお願いします。

Reply to #11906

RE: 数値型でソートできない (2004-11-19 18:00 by miyamo #11909)

いつもお世話になっております。
miyamoと申します。

ディメンションテーブルのカラムの型を変更するのではなく、
データの方を書き換える方法でお願いします。
※文字型でも正しくソートされるように、左側に0を追加し、桁数を整える。

以下、手順です(先ほどと同じ部分がほとんどですが、再度記述します。)

1.ソートカラムに数値型を指定しているディメンションのIDを調べる。
→Designer→ディメンション→該当するディメンション画面の「ディメンションID」の項目
2.そのディメンションをカスタマイズしていれば、パーツIDを調べる。
(カスタマイズしていなければ、1)
→Designer→ディメンションのカスタマイズ→該当するディメンションの画面の「パーツID」の項目

psql等で、OpenOLAPのメタDatabaseに接続し、
OpenOLAPのディメンションテーブル(oo_dim_ディメンションID_パーツID)の
sort_colのデータを書き換える。

ここでは、
・ディメンションID=10
・パーツID=1
を想定しているので、
oo_dim_10_1
のテーブルとなっている。
※調査したディメンションID、パーツIDにあわせて書き換えてください。

update oo_dim_10_1 set sort_col = lpad(sort_col,15,'0');
※number型は、最大でも15桁を想定。


また、運用時にCubeを更新した際は、sort_colのデータも書き換わるため、
Designer→キューブマネージャー→SQLチューニング→Cube名→データロード
の画面を開き、該当ディメンションの更新プロシジャーの後にも、
上記update文を追加してください。

*************サンプル******************
-- ディメンションメンバーの更新(1)  プロダクトソート
--OpenOLAP Executing Procedure--
SELECT oo_meta.oo_dim_member(10,'public') as a
;

-- ディメンションメンバーの更新(2)  プロダクトソート
--OpenOLAP Executing Procedure--
SELECT oo_meta.oo_dim_parts(10,'1') as a
;

-- ディメンションメンバーの更新(3)  プロダクトソート
--OpenOLAP Executing Procedure--
SELECT oo_meta.oo_dim_level_adjust(10,'1') as a
;
---↑ここまでは、記述してある。

---↓このUpdate文を追加
update oo_dim_10_1 set sort_col = lpad(sort_col,15,'0');

*************サンプルここまで******************


以上で、大丈夫だと思います。

よろしくお願いいたします。




Reply to #11908

RE: 数値型でソートできない (2005-01-20 18:09 by gibap #12570)

この問題は、回避策でどうこうという問題ではなく、仕様として不適切ですよね。数値型のフィールドは数値としてソートされるべきだと思います。
Reply to #11881