Vive hodie ―今日一日

日記やらメモやら何か

データとかなんとかとか

GUIでデータベース処理ってきっついのね、と嘆くへっぽこシステム担当者です。

本職じゃないけど。

 

Accessデータベースで、クエリを複数作成して結果を連結するという荒業をクエリとVBAを用いて実行していました。

2000件超のデータテーブルが複数あるのですが、そのうち任意の2テーブルをフォーム上で指示。

で、2つのクエリで各々を処理。その際にはフォームで指示した内容をSQLで投げ込んで、クエリが参照するテーブルを変更。(要はそれぞれのクエリは任意のテーブルを参照させられる設定)

 

んで、2つの結果を1つのクエリに統合。さらに統合した結果に手を加えて、連結してできた結果を「重複なく」抽出する形に。

実際動かすと、この処理だけなら1分かかりません。面倒ですけれど。

 

ただ、その後に最終的に出た結果から集計するとものすごい時間がかかるという。

……クエリからテーブルを作成し、そのうえでやったほうがオンメモリじゃない分動作は速くなるのかな、とちょっと考えつつ。

 

何をやってるのかは、とりあえず分割。

 んで、しっかりかくと、クエリがQ1~4、テーブルがtbl1~10まであると仮定します。

業務に使っているのと同じ説明だとアウトなので、違う形で説明しますが、tbl1~10は、ある年度の商品の売上数や返品数などを示しているとします。tbl1は2000年、tbl2は2001年といったように。

それぞれのテーブルには商品IDと商品名。

で、それぞれの商品を経年での変化を見たい。

この時、本来ならリレーションを結ぶだけでいいはずですが、同位のテーブル(IDと商品名だけ別テーブルのような、リレーションが結べない)形だったので、各々をまとめます。(業務上は1ステップ、それぞれのテーブルを編集するクエリを挟んでいます。それがQ1とQ2)

Q3では左端のフィールドに、Q1とQ2のIDと商品名をセット。こうすると、

フィールド名   商品名1  商品名2

         商品名A  商品名A

         商品名A  商品名B

のように、それぞれの総当たりのようなものが作成されるので、その隣のフィールドに判定式を入れる。

一致判定:IIF([商品名1]=[商品名2],1,0)

でオッケー。2つの商品名が一致してれば1を返すという単純な代物。

で、最後にQ4で

商品名:[商品名1]

select 一致判定 where [一致判定]=1

で抽出すると、複数年での評価ができるクエリができるという。

 

……書いてて意味わからないと思う。やった自分でも。

でもまぁ、自分への備忘録でもあるので。