- ベストアンサー
クエリーの抽出条件、テーブルの構成について
- LIbreoffic Baseを使用している場合のクエリーの抽出方法と、テーブルの構成について教えてください。
- 顧客ごとに日別、月別、年別の金額の明細と金額の合計、割引額を抽出する方法を教えてください。
- 顧客が同一日に購入した店舗数によって異なる割引率を表現し、明細として抽出する方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
回答ではないけど。 >明細テーブル >明細ID 顧客名 店舗名 商品名 日付 金額 テーブルの作り方が間違っています。 明細テーブルは 明細ID 顧客ID 店舗ID 商品ID 日付 金額 のように「○○ID」を持たないといけないです。 例えば 顧客ID:123 顧客名:佐藤太郎 顧客ID:456 顧客名:佐藤太郎 のように「同姓同名」の顧客が居たらどうなるでしょう? 売り上げ明細を 明細ID 顧客名 店舗名 商品名 日付 金額 で持っていたら、同姓同名の人が同じ日に同じ店舗で購入すると 明細ID:1022 顧客名:佐藤太郎 店舗名:ひたちなか青葉(以下略) 明細ID:1026 顧客名:佐藤太郎 店舗名:ひたちなか青葉(以下略) と言う2件のレコードが出来て、区別できなくなります。 さらに「伊藤花子さんが結婚して後藤花子さんになった場合」を考えてみて下さい。 また「店舗統廃合」で「店舗名が変わってしまった時」にも「店舗名でデータを記憶する」と混乱の原因になります。 以上を踏まえ、明細データは 明細ID 顧客ID 店舗ID 商品ID 日付 金額 のように「ユニークなIDコード」でデータを保持しなければなりません。 明細データを 明細ID:1022 顧客ID:123 店舗ID:1145(以下略) 明細ID:1026 顧客ID:456 店舗ID:1145(以下略) のように持って 顧客ID123は、佐藤太郎 店舗ID1145は、ひたちなか青葉店 のように「IDコードから実データを参照する」ようにします。 >各テーブルのプライマリーキーは顧客名、商品名 店舗名 明細IDです。 これも「間違い」です。 プライマリーキー(固有のユニークなキー)は「○○ID」でなければなりません。 各テーブルのプライマリーキーは、顧客テーブルは顧客ID、商品テーブルは商品ID、店舗テーブルは店舗ID、明細テーブルは明細IDにしなければなりません。 上記を踏まえ「割引率を算出するクエリ」を考えてみます。 まず、明細を「顧客IDと店舗IDと日付」でグループ化します。 SELECT 顧客ID,店舗ID,日付 FROM 明細 GROUP BY 顧客ID,店舗ID,日付 これを仮に「割引率算出準備クエリ」とします。 更に「 顧客IDと日付」でグループ化し、件数を出します。 SELECT 顧客ID,日付,COUNT(*) as 件数 FROM 割引率算出準備クエリ GROUP BY 顧客ID,日付 すると、このクエリの結果は 顧客ID:123 日付:2017/1/20 件数:1 顧客ID:123 日付:2017/1/22 件数:2 顧客ID:123 日付:2017/1/25 件数:1 顧客ID:123 日付:2017/1/27 件数:3 のようになります。 顧客123が1/20日に1つの店舗だけで購入すると「件数」は「1」になります。 顧客123が1/22日に2つの店舗で購入すると「件数」は「2」になります。 顧客123が1/25日に1つの店舗だけで購入すると「件数」は「1」になります。 顧客123が1/27日に3つの店舗で購入すると「件数」は「3」になります。 つまり、この「件数」が「1」なら「割引なし」に、「2」なら「10%引き」に、「3以上」なら「20%引き」になります。 IIF句を使って「1なら0%、2なら10%、3以上なら20%」とすれば良いでしょう。 これで、以下 顧客ID:123 日付:2017/1/20 割引率:0 顧客ID:123 日付:2017/1/22 割引率:10 顧客ID:123 日付:2017/1/25 割引率:0 顧客ID:123 日付:2017/1/27 割引率:20 のように「顧客IDごと、日付ごとの、割引率」が抽出できます。
お礼
ありがとうございます。 VBを使ってのクエリを記述方法がよくわかりません。すこし調べます