2009年11月30日月曜日

ないデータを表示するクエリ データベースとは…


データベースを整備するというのに、これからこういう仕事をしますから、こういうのを作って欲しいということはありません。たいてい、現在このように運用しており、こんなになっちゃいました。という話から始まる。 で、自分も最初の頃は単純に考えて上のような感じで顧客情報テーブルにこの人がこれを買って、これを買ってなくてという情報を紐つけていました。要するにテーブルひとつくらいでやっているデータベース(エクセルのままとか)が多いわけです。

でも、テーブルを分割してなかったらACCESS使っているというても入力画面が見やすいというだけであります。うちは商品少ないからいいねん。エクセルのままでいいねん。 という人も多いです。

で、そもそも会社の業務の流れを客観的に見て、どういうデータの設計をしたらいいかということを考えるのが重要です。

パチンコ攻略情報販売の吉野大観先生は、俺は本物なので、これ読んでわからん人とは付き合いたくないと。あまりというか、まった顧客フォローに熱心じゃないので、ムチャな顧客管理で適当にやっておられたのですが、それでも全国会員3000名で、商品も日々進化していき、どんどん事務作業がややこしくなっておられたので、もうホンマにせないかんなということで今回、急ぎで買ってあまり使ってなかった最新のACCESS2007でデータベース開発をやってみました。

上の図のようにとりあえず今回分析しました。これに本当は入金確認記録もいるんだけど、とりあえずそこまではいいということで。


これが今回作ったものの入力画面です。上の顧客情報と、売上情報(商品はセットで安く購入する場合もあるので単品でいくらという単純なものではない) 下左に商品単品の購入の有無。 下右にその人に送ったDMの記録をしていきます。

これって、どんなビジネスでもありうるパターンだと思うのでご紹介しました。

で、先生ところの場合は、あなたはこれを持っているけど、これは持ってないから買いませんか?というDMをたまに出すのですが、それが先生の趣味でとても複雑になります。 これとこれを買ったら、こうなって安くなるみたいな。 先生自身もその内容をあまりに複雑で忘れてしまい、めんごくさくなって、突然流れが変わるという独特の思考パターンを持っておられます。 また、商品も不滅のホール攻略で基本は変わらず単純なんですけども、実践においての1パチ対策とか等価の店対策などで日々進化しており、細かいバージョンアップがあり、実は結構内容が変わっています。

ですから、先生もいったい送ったDMがどんなDMだったかという記録もしていってもらうように今回しました。 毎回、アイデアが変わるので、変わりすぎて困る会社にもぴったりです。商品が少ないという会社は多いと思いますが、細かいバージョンアップというのあはると思うし、ACCESS導入するなら商品DBは分けておくべきです。


まず、図面のようにすると顧客人数×商品アイテムのクエリができ、これをマスタークエリにします。
演算とするのがミソのようです。


これは、SQLだとSELECT 顧客データベース.名前, 顧客データベース.顧客ID, 商品単品リスト.商品単品一覧, 商品単品リスト.ID FROM 顧客データベース, 商品単品リスト;となります。

で、これをマスタークエリとして、今度は購入記録テーブルを使って未購入者を表示させるクエリを作ります。

SQLで見ると
SELECT マスタークエリ.名前, マスタークエリ.ID, マスタークエリ.商品単品一覧, マスタークエリ.顧客ID
FROM 購入者管理 RIGHT JOIN マスタークエリ ON (購入者管理.顧客ID = マスタークエリ.顧客ID) AND (購入者管理.商品名 = マスタークエリ.ID)
GROUP BY マスタークエリ.名前, マスタークエリ.ID, マスタークエリ.商品単品一覧, マスタークエリ.顧客ID, 購入者管理.商品名
HAVING (((マスタークエリ.ID)=[Forms]![未購入者確認]![リスト0]) AND ((購入者管理.商品名) Is Null));
です。 これでフォームに買ってない商品番号を選んだ状態にすると、買ってない人が表示されます。
要するにマスタークエリの全部と購入記録を表示させる設定がミソで、それでデータがないものを表示させるというのに気がつきました。
これって結構基本的な技術で、昔本で読んだことあったのですが、すっかり忘れていて結構新鮮な感動でございました。

で、さらに今回私はDMを出して、この買ってない人にどんなDMを出したかも確認できるようにしました。

同じ技術ですが、若干違います。というのはDMはまったくDMを出してない人というのが存在するため、DM×顧客数 というマスターが作れません。 そこでDMマスターは以下のようにしました。

これで顧客の全員とDMを出していたらその記録が出て、出してない人にはデータのない状態として見えます。
SELECT Last(顧客ごとDM発送記録テーブル.DM名) AS DM名の最後, Last(顧客ごとDM発送記録テーブル.DM日付) AS DM日付の最後, 顧客データベース.名前, 顧客データベース.顧客ID
FROM 顧客ごとDM発送記録テーブル RIGHT JOIN 顧客データベース ON 顧客ごとDM発送記録テーブル.顧客ID = 顧客データベース.顧客ID
GROUP BY 顧客データベース.名前, 顧客データベース.顧客ID;

このDMマスタークエリをさらに追加したのが、


SELECT マスタークエリ.名前, マスタークエリ.ID, マスタークエリ.商品単品一覧, マスタークエリ.顧客ID, DMマスタークエリ.DM名の最後, DMマスタークエリ.DM日付の最後
FROM DMマスタークエリ INNER JOIN (購入者管理 RIGHT JOIN マスタークエリ ON (購入者管理.商品名 = マスタークエリ.ID) AND (購入者管理.顧客ID = マスタークエリ.顧客ID)) ON DMマスタークエリ.顧客ID = マスタークエリ.顧客ID
GROUP BY マスタークエリ.名前, マスタークエリ.ID, マスタークエリ.商品単品一覧, マスタークエリ.顧客ID, DMマスタークエリ.DM名の最後, DMマスタークエリ.DM日付の最後, 購入者管理.商品名
HAVING (((マスタークエリ.ID)=[Forms]![未購入者確認]![リスト0]) AND ((購入者管理.商品名) Is Null));
となります。

これ、考えてみたらいろんなところに使える便利なシステムだと思うので途中までのものですが公開します。access2000に落としております。 よかったら使ってみてください。これに印刷システムとか、いろいろ追加していかないといけないと思いますけど。 このような仕事のご相談もよろしくお願いします。 勉強したいので…。

忙しかったので、オープンオフィスでやる暇がありませんでしたが、本当はオープンオフィスで開発したかったなぁ。まぁそのうち。
今回初めてACCESS20007を本当に使ってみましたが、確かにちょっとしたこと便利になってます。やっぱり高いソフトは快適だよな。 リレーションシップを簡単に印刷できるとか便利だと思った。説明もこれまでになく親切だった気がする。 思わずオープンオフィスに心を捧げていたけど、マイクロソフトにもどりそうになった。  ほんまに、パチンコにゆっくり行く暇がない。 正月はやめといたほうがいいよ。この頃、ほんまに大変ですから。 やってる人が増えてきてるから店があまり努力しなくなっていると思います。


****************

お恵みください!










****************
後日、クロス集計の表で単純に買った日付を表示させることで一覧にするほうがいいことに気がつきました。

お問合せフォーム

お名前 :
Email: (必須)
メッセージ: (必須)


0 コメント :

コメントを投稿



連絡フォーム

名前

メール *

メッセージ *

サイト内検索