データ集計作業の効率化について

このQ&Aのポイント
  • データ集計作業に手間がかかり、効率化が求められています
  • クエリを使用して「利用している店」ごとの人数を集計しているが、一部のレコードには店名が入力されておらず、別のフィールドから取得している
  • 実在しない店名や支店名の表記ゆれに対応するため、自力で分けて集計結果を合算しているが、手間がかかるため効率化が望まれている
回答を見る
  • ベストアンサー

データが特殊で、集計作業に手間がかかっている

顧客情報テーブルに対してクエリを流し、「利用している店」ごとの人数を出しています。 ここではテーブル名を「顧客情報テーブル」、「利用している店」のフィールド名を「店キー」とします。 流しているクエリは下記の通りです。 SELECT 店キー, COUNT(*) FROM 顧客情報テーブル GROUP BY 店キー; この「店キー」は、値が入っている場合は、実在する企業名のみ登録されているようなので、値さえ入っていれば、店ごとの利用者がこのクエリで出せます。 しかしながら、私はシステムの中身まで分からないのでどのようになっているのか知りませんが、「店キー」に値がないレコードがかなりあります。 想像ですが、システムリリース初期のデータについてはそういうレコードがあるのと、マイナーな店については「店キー」が入っていないようです。 この場合、「店名」というフィールドの値を参照します。 「店名」は、ユーザーが自分で入力して登録する部分のようです。 基本的には実在する店の名前を入力してくれているようです。(こんな店ある?っと思ったら、ググってみたり) ただ、お試しで使っているユーザーが「りんご商店」など、架空の店名を入れる場合も多いです。 で、下記のクエリを流して、店キーが空のレコードの、店名を得ています。 SELECT 店名, COUNT(*) FROM 顧客情報テーブル WHERE 店キー = "" GROUP BY 店名; ここからが大変で、実在する店とそうでない店を自力で分けて、最初のクエリで出した集計結果と合算しています。 実在しないのについては、まとめて「その他」扱いにしています。 また、実在する店の名前でも「○○商店 東京店」、「○○商店 神奈川店」のように、支店名が入力されている場合があるので、目で見て一つの 「○○商店」としてカウントし、最初のクエリ結果と合算しているわけです。 大変手間がかかるし、ミスするので、これを何とか一本のクエリで自動化できないものでしょうか? CASE式を活用すればなんとかなりますでしょうか。 よろしくお願いします。

noname#229570
noname#229570
  • MySQL
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5085/13292)
回答No.2

たぶん例外が多すぎてクエリでは無理でしょう。 プログラムを組んで正規表現を使ってマッチさせながらカウントすれば何とかなるかもしれませんが、根本的にデータ構造が不適切ですから、データ構造の見直しをするべきですね。

noname#229570
質問者

お礼

やはり厳しそうですね。 ありがとうございました

その他の回答 (1)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 目で見て一つの「○○商店」としてカウント のようなケースをクエリでというのは無理では? (店名と支店名の間はスペースで、支店名の無い店名にはスペースが  存在しないとかの判定条件が有れば別ですが。) 「店キー」と「店名」はユニークな組み合わせで全て実在し、 「店キー」が空の場合はまとめて「その他」扱いにして良いのなら、 SELECT IIf(IsNull([店キー]),"その他",[店キー]) AS キー, Count(*) AS 式1 FROM 顧客情報テーブル GROUP BY IIf(IsNull([店キー]),"その他",[店キー]); で、出来るかと思いますが、そういう訳ではないようですよね。

noname#229570
質問者

お礼

やはり厳しそうですね。 ありがとうございました

関連するQ&A

  • Accessデータ並べ替えをハイブリッドにしたい

    [使用しているツール] Access 2007 PROFFESSONAL [やっていること(現状)] 1つのテーブルで複数のクエリ(複数のフィールドの並べ替えが必要な為)と複数(クエリと同数)のフォームを作成して、フォームの数だけコマンドボタンを作成してフォームを一覧表示で開いています。 [やりたいこと] 1つのテーブルで「1つのクエリ」による複数のフィールド(名)を切替えて、「1つのフォーム」で表示(一覧)させたいと思っています。 例えば、テーブル名:顧客名簿(取引先、県名、商品名、入庫日)、クエリ名:顧客名簿クエリ、フォーム名:顧客名簿一覧としたとき、(取引先、県名、商品名、入庫日)をコンボボックス等で切り替えることで、指定したフィールド(名)で並び替えられたデータを「フォーム名:顧客名簿一覧」に表示させられないでしょう。 [考えたこと] コンボボックス(名前:コンボ1)を作成し値集合ソースに「”取引先”;”県名”・・・・。」と入力、クエリ「顧客名簿クエリ」の抽出条件欄にビルダを起動させて「・・・コンボ1」を指定、フォーム「顧客名簿一覧」のレコードソースにクエリ「顧客名簿クエリ」を選択しました。しかし、フォーム「顧客名簿一覧」を開いても、データは抽出できずデータなしの表示で先へ進めていません。 以上ですが、宜しくお願いします。

  • ACCESSでデーフル作成入力フォームで入力しながら、クエリのデータを参照したい

    ACCESSで売上明細テーブルを作成し、入力用のフォームを作成しました。他に顧客マスタテーブルがあります。売上明細には顧客CDフィールドがありますが、顧客名等はマスターに存在するため設けてません。しかし売上明細入力時に顧客CDを入力した時点で顧客名の確認がしたいのです。そこで入力フォームの顧客CDの隣に非連結でテキストボックスを作り、そこに顧客名を表示したいのです。売上明細には顧客名のフィールドは追加したくありません。ただ参照したいだけです。顧客マスタと売上明細で顧客CDをキーにクエリを作成し、明細に対応する顧客情報は顧客情報検索というクエリで作成済みです。入力フォーム画面の非連結のフィールドのプロパティのコントロールソースに =DLookup("[顧客名]","顧客情報検索","[顧客CD] =" _ & Forms![売上明細入力Form]![顧客CD]) と表記しましたがエラーになります。 最初はコントロールソースに直接顧客情報検索クエリの顧客名フィールドを表記し、フォーカス取得時にクエリを開くマクロを実行していました。でもやはり表示されませんでした。 顧客名の設定をどのように設定すればいいのですか? コントロールソースでの設定だけでは無理なのでしょうか? よろしくお願いします。

  • Access クエリ このレコードセットは・・・

    いつもお世話になります。 Accessで下記の様にクエリを作成しましたが、”このレコードセットは更新できません”と出てしまいます。 ■テーブル1  ・顧客ID(主キー)  ・顧客名  ・住所  ・TEL ■テーブル2  ・顧客ID  ・取引ID(主キー)  ・請求金額 ■クエリ1(集計クエリ)  ・顧客ID グループ  ・請求金額合計: Sum(請求金額) 合計 ■クエリ2(実際に使用するクエリ)  ・顧客ID(テーブル1)  ・顧客名(テーブル1)  ・住所(テーブル1)  ・TEL(テーブル1)  ・請求金額合計(クエリ1) このクエリ2を開いて更新しようとしても、”このレコードセットは更新できません”と左下に表示されて更新できません。 ・請求金額合計(クエリ1)を除けば問題なく更新できます。 ですが1顧客に対して通算で幾ら請求をしたかとその顧客のデータを同一クエリで表示・更新したいので、意味をなさなくなってしまいます。 どなかた良い方法をご教授下さいませ。

  • アクセス クエリの重複について。(初心者です)

    一つのフォームに非連結のテキストボックス(入力画面)とリストの中で、管理参照画面みたいな感じで、一覧を並べたいのです。リスト内で選んだ項目が非連結のフォームに入っていくような感じで。。リストに表示する内容はクエリから引っ張ってくるようにしました。テーブルには数字で持たせているので、コンボボックスで表示がされるように、リストボックスの中に列幅2cm;3.808cm;3.808cm;2.508cm;4cm;2.503cm;等と指定して、値集合タイプにテーブル/クエリ、値集合ソースにクエリ名として表示するようにしました。データを3件入力すると、当たり前なのですが、テーブルには3件のレコードがありました。クエリには9件のレコードが表示されています。レコード内で数字を名称として表示できることは出来たのですが、レコード数が増えて保存されるのはどうしてなのでしょうか?テーブルには複数に主キーをもたせてあります。重複するはずないのですが・・。テーブルにはちゃんと入力した分だけ3つの情報が入っているのに、クエリには9件と増えてしまっているのでしょうか?テーブルに1,2,3と入っていたら、クエリには1,2,3,1,2,3,1 ,2,3と入っています。原因はなんなのでしょうか。

  • access クエリで集計した数値を別クエリで使いたい

    access2003で2000ファイル形式で以下のものを作っています。 テーブル「A」(フィールドは登録番号(主キー)、 書名) 「B」(登録番号(主キー)、 書名) がある。Aの「登録番号の最大値」(100とする)をクエリ(クエリ名「集計クエリ」)で集計して得た。 テーブルBの登録番号(1~30とする)を更新クエリで(1+100 ~ 30+100)に更新したい。そこでデザインビューで登録番号フィールド(テーブルB)の「レコードの更新」欄にビルダーで「[B]![登録番号]+[集計クエリ]![登録番号の最大値]」と入力して実行したら 実行できなかった。(仕方ないので「[B]![登録番号]+100」として実行したら更新できた。)今後もあるので「集計クエリ」で得た値を直接呼んで、更新クエリを実行したいのだが・・・。 わかりにくい質問で恐縮です。ご理解頂けたならば、ご教授ください。

  • 主キーの変更

    次のようなテーブルが存在します。レコードはあくまで参考の値です。主キーについては必ず一意の値になるようにしています。 代理店sample1がIDを紛失し、再発行を依頼された場合や,その下の顧客店やこきゃくがIDを紛失し、再発行をする場合に既存のデータをそのまま保持したまま主キーだけを変更して関連された他のテーブルに一斉に反映させるにはどうすればよいでしょうか? ここには記載していませんが顧客店IDやこきゃくIDに関連する別テーブルが10ほど存在します。 主キーが存在するレコードと重複していないかをまずチェックしてそこから基礎となるテーブルに書き換えを行いと考えているのですが、思考がそこで止まってしまっています。 よろしければアドバイスをよろしくお願いいたします。 代理店テーブル |代理店ID(主キー) |代理店名| |        aaaaa | sample1| |        bbbbb | sample2| 顧客店テーブル |代理店ID(主キー) |顧客店ID(主キー)|顧客店名| |        aaaaa |      a-00001| ○○1店| |        aaaaa |      a-00002| ○○2店| |        bbbbb |      b-00001| △△1店| |        bbbbb |      b-00002| △△2店| 顧客テーブル |顧客店ID(主キー) |      こきゃくID(主キー)| こきゃく名| |        a-00001|    a-20071015-00001| Aさん   | |        a-00002|    a-20071015-00002| Bさん   | |         b-00001|     b-20050915-00001| Cさん   | |        b-00002|    b-20050915-00002| Dさん   |

  • Access2002のリレーションについて。

    販売管理のデータベースを作成しています。 『販売店マスターテーブル』 販売店コード(主キー) 販売店名 郵便番号 住所 電話番号 営業担当者コード 『営業担当者テーブル』 営業担当者コード(主キー) 営業担当者名 『販売伝票テーブル』 伝票番号(主キー) 売上日 販売店コード この中で、『販売店マスターテーブル』から、販売店コード,販売店名,郵便番号,住所,電話番号,営業担当者コードを、 『営業担当者テーブル』から、営業担当者名を使って、新しいクエリを作成しました。 そのクエリを基にフォームを作成しましたが、フォームに新規レコードを入力できません。 念のため、販売店コードを『販売伝票テーブル』からとってきたら、新規レコードが入力できるようになりました。 これは、何か主キーの関係で入力できないんでしょうか。 もし、『販売伝票テーブル』から販売店コードをとらなくちゃいけないとしたら、それはナゼでしょうか・・。 初歩的なことで申し訳ありませんが、とても困っています。 どなたかお分かりになる方、教えて下さい。 よろしくお願いします。

  • ACCESS2000 コンボボックスによるデータ入力

    2つのテーブルがあります。 1つのテーブルは、顧客テーブルとし「氏名」「住所」「TEL」「担当者」とします。 もう1つは、担当者テーブルとし「ID」「担当者」 フォームで、 1つめの「担当者」のところをコンボボックスにしました。 プロパティは、 コントロールソース→担当者 値集合タイプ→テーブル/クエリ 値集合ソース→担当者テーブル としました。 顧客テーブルの「担当者」フィールドは、担当者テーブルから取得したいの です。 しかし、フォームで開きコンボボックスで値を変えようとしますが、 データが固定していて顧客テーブルに入力されません。 ほかのボックスは入力OKです。 リレーションは、担当者フィールド同士で設定してもしなくても 入力は可になりません。 状況がつかみづらいですが、わかる方教えてください。

  • アクセスである文字を含む検索

    ACCESS2000を使っています。 あるデータテーブル「発注書テーブル」があって、ここでは「(1)ID」「(2)顧客名(法人)」「(3)発注商品」「(4)納品済チェック」の4つフィールドがあるとします。 作業はフォームで行います。フォーム名は「発注書フォーム」。 「(2)顧客名」から検索をかけたくて、検索コマンドボタンをつくり、「検索フォーム」を発注書フォームとまったく同じ形態でつくり、そこにとべるようにしました。 「検索フォーム」には「検索」というテキストボックスを作ります。 「検索クエリ」というクエリを作り、発注書テーブルを素とし、すべてをデザインビューで表示するようにしました。 そして、「(2)顧客名」の抽出条件に[Forms]![検索フォーム]![検索]を入力します。 すると、「検索フォーム」の「検索」をコンボボックスにして、顧客名をすべて表示させ選択した場合は、「検索フォーム」では、選択した顧客の情報が表示されるようになりました。 が、しかし、「検索」をコンボボックスではなく、テキストボックスで、しかも顧客名の一部だけを入力したら、その文字を含むすべてのレコードを表示してほしいのです。 そこで、「検索クエリ」の「(2)顧客名」抽出条件にlike"*[Forms]![検索フォーム]![検索]*"と入力してみました。 そして「検索フォーム」の「検索」テキストボックス(非連結)に顧客名の一部を入力したところ、ぜんぜん絞りこみ抽出してくれません。 もちろん、クエリ上でも絞り込んでいない模様です。 どうしたら文字の一部からその文字を含む顧客名のレコードを全て抽出し、表示させることができるでしょうか? 細かくてすみませんが、かなり困ってます。 どうかわかる方、教えてください。 まったくちがう方法(別の手法)でもかまいません。 この説明でわからない部分がありましたら補足しますのできいてください。 よろしくお願いします。

  • 複数のテーブルに対して・・・

    過去に同様の質問があったかも知れませんが、Accessのバージョンがかなり古いので質問させて下さいね。 Access97(すみません、ホント古くて…)で、下のような顧客情報管理ファイルを作成しました。 テーブルA<→フォームA> ・顧客ID(主キー: テキスト型) ・氏名 ・情報A1, A2~ ・入力フォームB~への移動ボタン(同一IDレコードの表示) テーブルB<→フォームB> ・顧客ID(主キー: テキスト型) ・情報B1, B2~ テーブルC<→フォームC> ・顧客ID(主キー: テキスト型) ・情報C1, C2~ 最初からテーブルA~Cを結合したものを作ればよかったのですが、 それぞれのテーブルについて細かい入力項目が30~40個あるため、 分割して作成してしまいました(そして今後もテーブルは増える可能性大です)。 現在、テーブルAにだけ、20人分のデータが入っています。 今後も顧客数やテーブルが増える予定なのですが、 その都度テーブルごとに顧客IDをいれるのが面倒になってきました。 そこでお訊ねしたいのですが、テーブルA(を元にしたフォームA)に顧客IDを入れると、 テーブルBやCにも同じテキストが入力されるような設定は可能でしょうか。 最初、クエリーで連結しようとしたのですが、 既にテーブルAにいくつかデータが入っているせいか、どうも上手く反映されません。 単に私の参照方法が下手だったからかもしれませんが…。