Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
文字列の一部を指定したリレーション
投稿日時: 22/09/24 17:09:19
投稿者: koppage

二つのテーブルのでリレーションを行うのですが、フィールドの一部の文字列を参照してリレーションするにはどの様にすれば良いのでしょうか?
 
「売上テーブル」.「商品マスター」と「商品テーブル」.「商品マスター」の「商品マスター」で繋ぐのですが、「商品マスター」の例えば冒頭の10文字だけを参照してリレーションを行う場合です。
 
よろしくお願いします。

回答
投稿日時: 22/09/24 22:44:17
投稿者: hatena
投稿者のウェブサイトに移動

データベース設計としては、アンチパターンになります。
テーブル設計の段階で、フィールドを先頭10文字とそれ以降で分割しておくべきです。
そうしておかないと、件数が多くなるとパフォーマンスに影響が出てくる可能性があります。
 
どうしてもということなら、SQLで下記のように記述すれば可能です。
 

SELECT
 売上テーブル.*, 商品テーブル.*
FROM
 売上テーブル INNER JOIN 商品テーブル
 ON Left(売上テーブル.商品マスター,10) = Left(商品テーブル.商品マスター,10);

 
これはデザインビューでは設定できません。SQLビューで記述する必要があります。
このクエリは更新不可のクエリになります。
 

投稿日時: 22/09/25 22:00:42
投稿者: koppage

ありがとうございます。
 
>テーブル設計の段階で、フィールドを先頭10文字とそれ以降で分割しておくべきです。
 
ここなんですよね。
ある場所からデータをCSVで落としてくるんですが、まったく規則性の無いテキストメッセージから商品マスターのリレーションを行わざるを得ない状況です。
なので本来必要な情報のみを区分できない現状にあります。
 
ひとつ質問させてください。
 
10文字と指定した場合、レコードによってはそもそも10文字も無いものがあるのですが、そこは問題にはなりませんか?
例えば8文字しかないレコードがあっても、その8文字だけでリレーションできるのでしょうか?

回答
投稿日時: 22/09/26 10:42:19
投稿者: Suzu

「リレーション」というのが、
 「データベースツール」タブ の「リレーションシップ」の事であれば フィールドの一部
 という形での 作成はできません。
 
新たにフィールドを用意する必要があります。
 
CSV から インポートしたテーブルに 新たに フィールドを追加
そのフィールドに、LEFT関数 を使い、10文字分 の値を入れる 更新クエリを作成し実行しましょう。
 
 
運用をする上で、
 
1)既にインポート済みのレコードを含む CSV を新たに取り込む必要があるのであれば
 1)-1 先の テーブルの全レコードを削除し、CSV から そのテーブルに全レコードをインポート
 1)-2 更新クエリを使い 10文字分の値を代入する
 
2)既にインポート済みのレコードを含まない CSV を取り込む必要があるのであれば
 2)-1 先のテーブルと同じデザインのワークテーブルを予め用意
 2)-2 そのワークテーブルの全レコードを削除後、CSVから全レコードをインポート
 2)-3 ワークテーブル に対し、更新クエリを使い、10文字分の値を代入
 2)-4 先の テーブル に対し、ワークテーブルのレコードを追加
 
の様にします。
 
 

引用:
10文字と指定した場合、レコードによってはそもそも10文字も無いものがあるのですが、そこは問題にはなりませんか?
例えば8文字しかないレコードがあっても、その8文字だけでリレーションできるのでしょうか?

懸念がおありかと思いますが、試せる事は試してみましょう。その上で判らない事を聞くようにしてみてはどうでしょうか。

回答
投稿日時: 22/09/26 11:32:47
投稿者: sk

引用:
ある場所からデータをCSVで落としてくるんですが、
まったく規則性の無いテキストメッセージから
商品マスターのリレーションを行わざるを得ない状況です。
なので本来必要な情報のみを区分できない現状にあります。

その具体例を挙げた方がよいのではないか、というのが
現時点での印象。
 
引用:
10文字と指定した場合、レコードによってはそもそも10文字も無いものがあるのですが、
そこは問題にはなりませんか?
例えば8文字しかないレコードがあっても、その8文字だけでリレーションできるのでしょうか?

「まったく規則性の無い」がないなら、固定の文字数を指定して
何らかの文字列を抽出しようとする意味も根拠もなさそうに思えますが。

投稿日時: 22/09/26 16:17:37
投稿者: koppage

最初に教えて頂いたSQLの記述よりも、新たなフィールドを追加するというのが適切のようですね。
 
当方の事情を説明すると、まず、ネットショップの事業を営んでいる者です。
やろうとしていることは、売れた商品の出数を算出しようという事です。(棚卸の理論値を出したい)
 
ECモールから販売データをCSVで落とせるのですが、「どの商品が何個出た」という情報(そのための項目列)はありません。
 
店舗名(楽天やAmazonのこと)とテキストメッセージで「どの商品が何個出た」かを「人の目」で判別できるのですが、このテキストメッセージ(記載の仕方)に規則性が全くないのです。
現状は、この店舗名とテキストメッセージを連結させたフィールドを重複しないようグループ化したもので新たなテーブルを作成し、このフィールドの右列に手作業で商品名と個数のフィールドを追加入力して「商品マスター」とし、販売データのCSVの店舗名とテキストメッセージを連結させたテーブルを販売データの「基本テーブル」として、この連結フィールドで販売データと商品マスターのリレーションを行い、どの販売データ(レコード)で何の商品が何個出たのかを集計しています。
 
素人の知恵で作成したものなので、もっと効率の良い他の方法があるもかも知れませんが、現状で「集計」自体は上手く行っています。
 
問題なのは、テキストメッセージに規則性が無いために、同じ商品構成なのにメッセージの内容が異なるものが多数存在するという事です。
例えばスタート段階で商品マスターのレコード数は400ほどありましたが、商品構成の種類は150くらいしかないのです。
ここまでは、無駄でも一応は作業が完了したのですが、日々の販売データを取り込むたびに「新種」のテキストメッセージが出てきます。(商品構成自体は既存のもの)
既にグループ化した商品マスターの「店舗名」+「テキストメッセージ」に追加しなければならないものが続出してイタチごっこになるのです。
 
そこで、少しでも「新種」の出現(商品マスターの追加の必要性)を抑えるために、商品情報の記述がある文字列まで(一定の規則はないので最大値になる)をリレーションの対象にしてみてはどうかな?と考えている次第です。(これでイタチごっこがどのくらい収まるかはやってみないと分からない)
 
※「テキストメッセージ」には商品情報のほかに購入者にネット上で見せるためのメッセージなどが記載されています。(ECモールの違いがあり、記述の仕方や順番などがバラバラ)
 
文章では説明が難しく、当方の事情が通じると幸いです。
いろいろとご教授頂いていることに感謝申し上げます。

回答
投稿日時: 22/09/26 17:09:20
投稿者: taitani
投稿者のウェブサイトに移動

横から失礼します。(回答ではありません)
 
単純に
「ECモールから販売データをCSVで落とせるのですが、「どの商品が何個出た」という情報(そのための項目列)はありません。」
 
これが問題ですよね。
どの商品:商品コード列
何個出た:販売個数列もしくは、1レコード=1個
 
イタチごっごになるようなら、私なら別なモールを選択しますね。

回答
投稿日時: 22/09/26 17:14:36
投稿者: sk

引用:
店舗名(楽天やAmazonのこと)とテキストメッセージで
「どの商品が何個出た」かを「人の目」で判別できるのですが、
このテキストメッセージ(記載の仕方)に規則性が全くないのです。

その「テキストメッセージ」の具体例を挙げられない限り、
本当に規則性が全くないのか否かも第三者には評価のしようがありません。
 
もし本当に「『人の目』で判別できる」のであれば、少なくとも
その文字列の中には「商品を指し示す文字列(商品名や商品コードなど)」と
「販売された個数を示す文字列」のペア
が必ず含まれているはずです。
どちらか一方が欠けているということはあり得ません。
 
ならば、それらの要素をどのような手法によって機械的に抜き出すか、
どのようにして商品マスタのレコードと照合するかということが
問題になってくるわけで、それにはまず「テキストメッセージ」として
格納されている文字列の解析が絶対不可欠でしょう。
 
引用:
「テキストメッセージ」には商品情報のほかに
購入者にネット上で見せるためのメッセージなどが記載されています。
ECモールの違いがあり、記述の仕方や順番などがバラバラ

それは「利用しているサービスごとに CSV ファイルの出力フォーマットが異なる」
(だから「全サービス共通の規則性」がない)という意味でおっしゃっているのでしょうか。

投稿日時: 22/09/27 11:09:50
投稿者: koppage

>それは「利用しているサービスごとに CSV ファイルの出力フォーマットが異なる」
(だから「全サービス共通の規則性」がない)という意味でおっしゃっているのでしょうか。
 
そういう事です。
 
>ならば、それらの要素をどのような手法によって機械的に抜き出すか、どのようにして商品マスタのレコードと照合するかということが問題になってくるわけで、それにはまず「テキストメッセージ」として格納されている文字列の解析が絶対不可欠でしょう。
 
これは分かるのです。
ところが、例えば商品情報にしても「○○1本、△△1本」というものもあれば「○○500ml」があったりで、サイズや数量が記載されているものもあれば、「○○」や「△△」の様に別のところに記号で表示されたりしているものもあるのです。
数量の表示の仕方も「○○2本」もあれば「△△(2)」「○○:2」などもあります。
また、商品情報がコメントの前だったり中間だったりします。
 
例えば
「〇SHOP 楽天市場店Q0090Q味指定・本数:バニラ2本よかったらレビューを書いて欲しいです!:書いてあげる(感激です!)食品の為、置き配には対応しておりません。:承知致しました。」
 
ここにはサイズがありません。店舗名の後の「0009」がサイズを表しています。
 
「〇SHOP オフィシャルショップQ1001Q味指定:500ml(バニラ味1本・リンゴ味1本)」
「〇SHOP オフィシャルショップQ1001Q味指定:レモン1本」
 
上の二つは数量もサイズも異なりますので店舗名の後の「1001」はそれらを表していません。
 
※バニラやリンゴ、レモンには実際の商品名が入ります。
 
要するに商品名、サイズ、数量の情報があるのですが、この記述のルールが統一されておらず、サイズや数量を「○本」や「〇ml」と具体的に表示するものもあれば、数式などを用いて判別しているものもあるのです。
 
早い話、しべ手のモールの商品構成別を重複の無い記号に置き前れば簡単なのですが、そこに制約があるので苦慮しております。
 
 
 
 
 
 
 
 

回答
投稿日時: 22/09/27 11:29:21
投稿者: Suzu

引用:
既にグループ化した商品マスターの「店舗名」+「テキストメッセージ」に追加しなければならないものが続出してイタチごっこになるのです。

 
引用:
店舗名(楽天やAmazonのこと)とテキストメッセージで「どの商品が何個出た」かを「人の目」で判別できるのですが、このテキストメッセージ(記載の仕方)に規則性が全くないのです。
現状は、この店舗名とテキストメッセージを連結させたフィールドを重複しないようグループ化したもので新たなテーブルを作成し、このフィールドの右列に手作業で商品名と個数のフィールドを追加入力して「商品マスター」とし、販売データのCSVの店舗名とテキストメッセージを連結させたテーブルを販売データの「基本テーブル」として、この連結フィールドで販売データと商品マスターのリレーションを行い、どの販売データ(レコード)で何の商品が何個出たのかを集計しています。

 
CSVから 商品マスターを作ろうとするのが間違いでは?
商品として 出品する段階で、マスター登録をしておき
 
テキストメッセージ のデータ から
  商品マスターに登録されている商品名の文言が含まれているか
を判定する方が 効率的と思います。
 
 
 
テキストメッセージ の中身からどうしてもと言うなら
 
データ
---------------------------------------------
メッセージ
---------------------------------------------
楽天 商品A
楽天 商品B
楽天 商品C
Amazon 商品A
Amazon 商品B
Amazon 商品A + 商品B
Amazon 商品A + 商品C
Amazon 商品A 1個 + 商品C 3個
---------------------------------------------
がとあるとします。
 
 
店舗名が変わる事は無いでしょうから
 
店舗M
-----------------
店舗ID    店舗名
-----------------
1    楽天
2    Amazon
-----------------
は予め 作成できます。
 
InStr関数を使い、メッセージに 店舗Mの店舗名が含まれるかどうかは判定できますよね。
 
SELECT 店舗M.店舗ID, 店舗M.店舗名, データ.メッセージ
FROM 店舗M, データ
WHERE Nz(InStr(1, データ.メッセージ, 店舗M.店舗名,0),0)>0
---------------------------------------------------------------
店舗ID    店舗目    メッセージ
---------------------------------------------------------------
1    楽天    楽天 商品A
1    楽天    楽天 商品B
1    楽天    楽天 商品C
2    Amazon    Amazon 商品A
2    Amazon    Amazon 商品B
2    Amazon    Amazon 商品A + 商品B
2    Amazon    Amazon 商品A + 商品C
2    Amazon    Amazon 商品A 1個 + 商品C 3個
---------------------------------------------------------------
これを別のワークテーブルに納めます
 
 
ワークテーブル には、『メッセージ改』フィールドを用意しておきます
『メッセージ』フィールドに、Replace関数 を使い、
店舗名を【""】空白文字列に置き換え、
『メッセージ』から、店舗名を消します。
それを更新クエリを使い『メッセージ改』フィールドに入れる様にすると
 
---------------------------------------------------------------
店舗ID    店舗目    メッセージ改    メッセージ
---------------------------------------------------------------
1    楽天    商品A    楽天 商品A
1    楽天    商品B    楽天 商品B
1    楽天    商品C    楽天 商品C
2    Amazon    商品A    Amazon 商品A
2    Amazon    商品B    Amazon 商品B
2    Amazon    商品A + 商品B    Amazon 商品A + 商品B
2    Amazon    商品A + 商品C    Amazon 商品A + 商品C
2    Amazon    商品A 1個 + 商品C 3個    Amazon 商品A 1個 + 商品C 3個
---------------------------------------------------------------
の様になります。
 
 
ここで、メッセージ改に グループ化を行えば
---------------------------------------------------------------
メッセージ改
---------------------------------------------------------------
商品A
商品B
商品C
商品A + 商品B
商品A + 商品C
商品A 1個 + 商品C 3個
---------------------------------------------------------------
とはなりますが、【メッセージ】との事なので、
ここに表記した のみではなく、
表記以降にも文言が続いているのでしょうが
 
店舗名 を 消しただけでも 商品名は見易くなるかと。
以降に続くメッセージにも規則性があるでしょうから、
それらもマスター登録しておき、前述の方法を使い置換する事もできますね。
 
 
 
 
ただ、そんな使いづらいデータを わざわざ CSVファイルとするのは腑に落ちません。
 
店舗+メッセージであれば、「10文字」も固定では無いですよね?
10文字ない事もある と言うことであれば、固定長でもなのですよね?
個数もメッセージに含まれている様ですので 区切り文字が 違うだけの様にも思えますが
詳細が判らないので、当方はここまでです。

回答
投稿日時: 22/09/27 12:06:17
投稿者: Suzu

引用:
「〇SHOP 楽天市場店Q0090Q味指定・本数:バニラ2本よかったらレビューを書いて欲しいです!:書いてあげる(感激です!)食品の為、置き配には対応しておりません。:承知致しました。」
  
ここにはサイズがありません。店舗名の後の「0009」がサイズを表しています。

サイズがあるのでしょうか?ないのでしょうか?
 
  
引用:
「〇SHOP オフィシャルショップQ1001Q味指定:500ml(バニラ味1本・リンゴ味1本)」
「〇SHOP オフィシャルショップQ1001Q味指定:レモン1本」
  
上の二つは数量もサイズも異なりますので店舗名の後の「1001」はそれらを表していません。

1001 が サイズではない? では、サイズとは?
 
「バニラ味1本・リンゴ味1本」 これは、セット販売をしているのではないのですか?
それとも、購入者が、バニラ と リンゴ をそれぞれ 1本 づつ 購入したのに、
このような表記になっているのですか?
 
商品名は販売者である方が決め、記載するのですよね。
その記載方法に統一性を持たせていない 販売者側の問題ではないでしょうか?
 
 
セット商品でも、要素をなす商品毎の数量を把握したいと言うことでしょうか?
その場合はマスターの作り方を工夫します。
 
ID	商品ID	商品名	要素商品ID	要素商品名	要素商品数
1	1	商品A	1	商品A	1
2	2	商品B	2	商品B	1
3	3	商品A+商品B	1	商品A	1
4	3	商品A+商品B	2	商品B	1
5	4	商品A 1本 +商品B 3本	1	商品A	1
6	4	商品A 1本 +商品B 3本	2	商品B	3

 
 
自己連結 を使う方法もありますが、そのあたりは WEB検索をしてみてください。

回答
投稿日時: 22/09/29 11:18:32
投稿者: sk

引用:
>それは「利用しているサービスごとに CSV ファイルの出力フォーマットが異なる」
(だから「全サービス共通の規則性」がない)という意味でおっしゃっているのでしょうか。
  
そういう事です。

引用:
要するに商品名、サイズ、数量の情報があるのですが、
この記述のルールが統一されておらず、サイズや数量を
「○本」や「〇ml」と具体的に表示するものもあれば、
数式などを用いて判別しているものもあるのです。

ならばそれぞれのサービス/ファイルフォーマットごとに
データコンバートの仕組みや手順を策定すべきでしょう。
 
フォーマットが異なるファイルを一緒くたにして取り込んで
同一のルールに則ってデータを変換するなんてことは
基本的には無理な話です。
 
引用:
ところが、例えば商品情報にしても「○○1本、△△1本」というものもあれば
「○○500ml」があったりで、サイズや数量が記載されているものもあれば、
「○○」や「△△」の様に別のところに記号で表示されたりしているものもあるのです。
数量の表示の仕方も「○○2本」もあれば「△△(2)」「○○:2」などもあります。
また、商品情報がコメントの前だったり中間だったりします。

引用:
例えば
「〇SHOP 楽天市場店Q0090Q味指定・本数:バニラ2本よかったらレビューを書いて欲しいです!:書いてあげる(感激です!)食品の為、置き配には対応しておりません。:承知致しました。」

また上記のご説明の通りなのであれば、少なくともその CSV ファイルは
一般的な EC サイトに組み込まれているファイル出力/ダウンロード機能によって
作成された受注データや決済データであるとは正直思えません。
 
「商品情報」というよりは「顧客との(メールやチャットなどによる)対話の記録」、
あるいは「ブラウザで開かれた EC サイトの何らかのページ(の一部分、あるいは
全てのテキスト/ HTML ソース)をそっくりそのままコピーアンドペーストしたテキスト」
であるかのように見えます。
 
もし上記のいずれかのケースに該当し、利用なさっている全ての EC サイトから
同様の方法によってそれらのデータを抜き取っているということなのであれば、
まずデータの抜き取り方自体に問題があるでしょう。
 
引用:
やろうとしていることは、売れた商品の出数を算出しようという事です。
(棚卸の理論値を出したい)

そのように雑多な情報が入り混じった(受注や決済とは無関係の
トピックを含んだ)テキストを「売れた商品の出数を算出」する上での
根拠とするのは非常に危なっかしいです。
 
特に「商品名の識別」に関しては Suzu さんが回答されたように、
[商品マスタ]に全ての商品に関するレコードを格納した上で
照合処理を掛けなければ、どう足掻いても人間の解釈と判断に
委ねられることになってしまいます。

投稿日時: 22/09/30 14:11:31
投稿者: koppage

商品マスターには「商品1」「商品1個数」「商品2」「商品2個数」「商品3」「商品3個数」といったフィールドが作成されています。
 
売上データに様々な情報がありますが、商品に関しては下記の「店舗名」「番号」「項目(コメント、メッセージ)」の組み合わせでなければ判別できないのが現状です。
 
「〇SHOP 楽天市場店Q0090Q味指定・本数:バニラ2本よかったらレビューを書いて欲しいです!:書いてあげる(感激です!)食品の為、置き配には対応しておりません。:承知致しました。」
 
そこで最初に、ある期間の売上データから「店舗名」「番号」「項目」の三つを連結させて「商品マスターテーブル」を作成し、「連結フィールド」の後ろに冒頭の様に「商品名」と「個数」のフィールドを追加して「商品マスター」としました。
 
実際の集計は月単位で行いますが、「売上データ」と「商品マスター」をリレーションさせるには、上の連結フィールドを使うしかないのです。(このフィールドしか商品情報を表していないのですから)
 
この連結フィールドに「新種」が次々に出現することが現状のネックとなっています。
(商品の組み合わせは同じなのに、連結フィールドでは異なるデータとなるために、商品マスターを都度追加しなければならない)
 
楽天やYahoo,Amazonnそれぞれに売上データがCSVで落とせますが、フォーマットは様々です。
 
どこのEC事業者も同じだと思いますが、複数のモールを別々に(売上に関して)管理するのは非効率的です。
私が現在関わっている事業では月に20,000件ほどの売上が発生します。
 
そこで、「販売管理ソフト」(いろいろある)を使って、各モールの売上を集約して管理しています。
このソフトから配送業者への「配送伝票」や配送担当者への「発送指示書」が作成されます。
 
こういう事情から「販売管理ソフト」からCSVで売上情報を落として、本件の作業を行っています。
 
連結フィールドに「番号」というデータがあります。
この意味は各モールで異なります。
だから、これが個数を表すものであったり商品を表すものであったりしています。
ここを商品と個数を表す番号に統一できれば、これをリレーションに使えば良い訳で、全て解決なのです。
商品の組み合わせ自体は限られていますので、この番号が際限なく増えることはありません。
ところが、ソフト上の制約があってこれができないので困っている訳です。
 
このソフトが欠陥だと言えばそれまでです。
 
皆さんいろいろありがとうございました。
「販売管理ソフト」を替えない限り、現状で抱える問題が解決しないという事が理解できました。