• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(再度SQLのご指導を願います))

(再度SQLのご指導を願います) 注文テーブルの売上差と顧客種別ごとの客数の抽出結果について

このQ&Aのポイント
  • SQLを使用して注文テーブルから特定の期間と商品NOに基づいて売上差を計算し、求めたい結果を得る方法についてご質問です。また、顧客種別別の客数を計算する方法についてもお聞きしたいです。
  • 現在の実行結果では割引期間外の購入も割引購入として計算されてしまっています。修正したい結果は、割引テーブルの期間内の購入を割引購入として、期間外の購入を通常購入として表示することです。
  • 顧客種別ごとの客数を計算する際に、重複を避ける方法をお聞きしたいです。具体的には、同じ品目を複数回購入した場合でもレコードが一つにまとまるようにしたいです。

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

  • ベストアンサー
  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

No1です。 リピートは >対象期間内で購入があり、且つその設定日付以前にも同じ商品の購入があった場合 でしたね。 --- FROM 注文テーブル t LEFT JOIN (SELECT 顧客コード FROM 注文テーブル WHERE 購入日<#2011/02/28#) k ON t.顧客コード = k.顧客コード → FROM 注文テーブル t LEFT JOIN (SELECT 顧客コード,商品NO FROM 注文テーブル WHERE 購入日<#2011/02/28# GROUP BY 顧客コード,商品NO) k ON t.顧客コード = k.顧客コード and t.商品NO = k.商品NO

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.3

前回のミスのところを取り込んでいませんでした。 --- 誤り: , sum(switch(t.顧客種別='通常' and k.顧客コード is not null, 0 , true ,1)) as 初めて 正しい , sum(switch(t.顧客種別='通常' and k.顧客コード is null, 1 , true ,0)) as 初めて --- 補足 問題解決の方法はまずGROUP BYをはずしてみましょう そうすればどのレコードがどんなふうに抽出されているかがわかります。

全文を見る
すると、全ての回答が全文表示されます。
  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

これでどうでしょう --- (1) SELECT t.購入日 , t.商品NO , sum(switch(w.商品NO is null,t.購入数,True,0)) AS 通常購入 , sum(switch(w.商品NO is null,0,True,t.購入数)) AS 割引購入 , sum(switch(w.商品NO is null,t.購入金額,True,0)) AS 通常購入金額 , sum(switch(w.商品NO is null,0,True,t.購入金額)) AS 割引購入金額 FROM T_注文 AS t LEFT JOIN T_期間限定割引 AS w ON (t.購入日 between w.開始日 and w.終了日) AND (t.商品NO=w.商品NO) GROUP BY t.購入日, t.商品NO ORDER BY t.購入日 --- (2) (SELECT 顧客コード FROM 注文テーブル WHERE 購入日<#2011/02/28#) → (SELECT 顧客コード FROM 注文テーブル WHERE 購入日<#2011/02/28# GROUP BY 顧客コード) ---- (補足) INNER または LEFT JYOIN すると JYOINされる側に 対象レコードが2件以上あると元のレコードがそれに あわせて増幅されます。 注文テーブル 商品 レジ 100 111 割引テーブル 商品 開始 100 2011/1/1 100 2011/3/1 SELECT t.*,w.* FROM 注文 t INNER JOIN 割引 w ON t.商品 = t.商品 結果 100 111 2011/1/1 100 111 2011/3/1

papapapandatyun
質問者

補足

今回もご指導いただきありがとうございました! (1)については上記の内容で解決しました! (2)についてですが、ご指導いただいた内容に沿って修正したところ 一部不具合が生じました、、。 修正した文章: SELECT t.商品NO , t.年代 , sum(switch(t.顧客種別='通常' and k.顧客コード is not null, 1 , true ,0)) as リピート , sum(switch(t.顧客種別='通常' and k.顧客コード is not null, 0 , true ,1)) as 初めて , sum(switch(t.顧客種別='新規' , 1 , true ,0)) as 新規 , sum(switch(t.顧客種別='フリー', 1 , true ,0)) as フリー FROM 注文テーブル t LEFT JOIN (SELECT 顧客コード,商品NO FROM 注文テーブル WHERE 購入日<#2011/02/28# GROUP BY 顧客コード,商品NO) k ON t.顧客コード = k.顧客コード and t.商品NO = k.商品NO WHERE t.購入日 between #2011/03/01# and #2011/03/31# and t.商品NO = 100 GROUP BY t.商品NO, t.年代 この内容で抽出した結果: 商品NO 年代 リピート 初めて 新規 フリー 100 20代 1 1 1 0 100 30代 1 0 0 0 100 50代 0 1 0 0 3月に100を購入した20代の人は全部で2件 新規の"155555"と通常の"123456"であり、 新規の"155555"は新規としてカウントされてますが、 "123456"の方は1月に購入履歴があるため、リピートとしてカウントされると思います。 しかし、結果の表にはなぜか"初めて"にも1件入っており、 3月で20代が計3件の購入があったことになっています、、、。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 至急でSQLについて教えていただきたいです。

    【至急で知りたいです】アクセス SQL文について アクセス・クエリについて初心者であり、恐縮ではございます。 以下を求めたい時にどのようなSQLで注文をすればよいかご指導いただきたいです。 内容: ・注文テーブル: 列は購入日・顧客コード・顧客種別・年代・レジコード・商品NO・商品名・購入数・購入金額 2011/05/01 11111 通常 30代 12345 9999 お菓子 1 500 2011/05/01 11111 通常 30代 12345 9998 ご飯 2 1000 2011/05/01 11112 新規 10代 12346 9999 お菓子 1 500 ・期間限定割引テーブル 列は商品NO・開始日・終了日 9999 2011/04/10 2011/04/20 9998 2011/05/01 2011/05/10 抽出したい内容 (1)注文テーブルにある購入日で日付を指定の上、(betweenで2010/06/01-2011/05/31までなど) 商品NOを特定の1品目、もしくは複数選択をした上で、その商品に対する期間内の購入数・購入金額を求めたい。 ただし、"期間限定割引テーブル"に差し掛かる期間のみ、別の列で分けて表示させたい。 (つまり割引期間と通常期間を列で分けることで売上の差を見極めたいのです。) 例えば、商品NOを9998で指定した場合の希望内容 購入日 商品No 商品名 通常購入数 割引購入数 通常購入金額 割引購入金額 2011/05/01 9998 ご飯 0 100 0 50000 2011/05/11 9998 ご飯 30 0 24000 0 (2)注文テーブルにある購入日で日付を指定の上、(上記(1)と同様)商品NOを特定の1品目、もしくは複数選択をした上で、 年代別で顧客種別ごとの客数を知りたい場合 例えば、商品NOを9998で指定した場合の希望内容 商品NO年代 リピート 初めて 新規 フリー 9998 10代 2000 500 100 30 9998 20代 3000 1000 200 50 9998 30代 5000 1050 400 100 ← 客数です。 ※上の客数は顧客種別かレジコードをカウントすれば良いと思いますが、一人のお客様が一回の会計で5品目買ったらレコードは5つになるため、重複を防ぐ必要があります。(対象の品物を何回購入したことがあるか表示したいので、、) また、"顧客種別"は通常・新規・フリーの三種類の言葉で分類分けされて登録されてますが、通常のみ、設定した抽出対象期間前にも1回でも購入があれば"リピート"としてカウント、過去に購入なく抽出対象期間内で初めて購入があった場合は"初めて"にカウントしたいです。 複雑かもしれませんが、どなたかご指導をよろしくお願いします

  • SQL SERVER 店舗毎のTOP10

    表題の件のSQLについてアドバイスお願いいたします。 DB:SQL SERVER 2008 R2 テーブル:売上伝票 カラム 店舗|伝票No|伝票日付|商品CD|商品名|数量|単価|金額(数量x単価) SELECT TOP 10 店舗NO, 商品CD, 商品名, SUM(数量) AS 販売数, SUM(金額)AS 販売金額 FROM 売上伝票 WHERE 伝票日付 BETWEEN [開始日] AND [終了日] GROUP BY 店舗NO,商品CD,商品名, ORDER BY 店舗NO,販売金額 DESC 当然ですが、上記のSQLでは、一番若い店舗NOのトップ10しか抽出できません。 店舗別、販売金額のトップ10を抽出するための、SQL文についてお教えください。

  • クエリーの抽出条件、テーブルの構成について

    LIbreoffic Base を使用しています。 クエリーでの抽出仕方を教えてください。 <例> 複数の顧客がいます。 顧客Aが1つの店舗で商品を購入した場合に合計金額に対して割引はありません。 顧客Aが2つの異なる店舗で同一日に商品を購入した場合に各店舗毎の合計金額を合算して10%の割引を行います。 顧客Aが3つの異なる店舗(以上)で同一日に商品を購入した場合に各店舗毎の合計金額を合算して20%の割引を行います。 テーブルからクエリーで抽出して 結果として顧客ごとに日別、月別、年別に 顧客 日付 金額の明細と金額の合計 割引額の明細を作成したい。 テーブルの構成 顧客テーブル  顧客ID 顧客名 商品デーブル  商品ID 商品名 商品単価 店舗テーブル  店舗ID 店舗名 明細テーブル  明細ID 顧客名 店舗名 商品名 日付 金額 各テーブルのプライマリーキーは顧客名、商品名 店舗名 明細IDです。 質問ですが 顧客名 日付 店舗名、金額の明細と金額の合計 割引額を日別、月別、年別に抽出し計算するしかたを教えてください。 特に各顧客か同一日に購入した店舗数によって割引率が異なるので、これをクエリーの抽出条件としてどう表現し明細にしたらよいかで行き詰っています。 テーブルの構成にはこだわっていません。変更すべき箇所があれば指摘してください。 よろしくお願いいたします。  

  • SQL文を教えてください。

    受付テーブルと顧客テーブルがあります。 受付テーブル(受付日、顧客No、受付時間、受付内容) 顧客テーブル(顧客No、顧客名カナ、顧客名、顧客住所) 上記のテーブルがあるとします。 やりたい事は顧客Noを結合し 最新の受付日、前回受付日、前々回受付日を新しい受付日の順番に顧客毎に抽出したいのです。 仮に前回受付日と前々回受付日の内容が無ければNULL値を返します。 抽出したいフィールドは受付日、前回受付日、前々回受付日、顧客No、顧客名カナ、顧客名、顧客住所、受付内容です。 どんな構文になるのでしょうか? どのようなSQLになるでしょうか? うまく伝わっているでしょうか? よろしくお願いします。

  • Access、同じテーブルの2つの項目対他のテーブルで1つの項目のリレーションは可能?

    Accessで販売管理をしています。 以下のテーブルを作成し(*は主キーです)、 [売上T]  [商品M]  [顧客M]  [受注T] *売上NO  *商品ID  *顧客ID1  *受注NO 商品ID   商品名    *顧客ID2  商品ID 日付    顧客ID1     顧客名    受注日 金額    顧客ID2            受注金額        受注先1        受注先2 参照整合性にチェックを入れリレーションでつないでいます。 リレーションシップは下記のとおりです。 [売上T]商品ID―[商品M]商品ID―[受注T]商品ID [商品M]顧客ID1及び2―[顧客M]顧客ID1及び2―[商品M]受注先1及び2 ここで顧客と受注先が重複することもあるので、顧客Mから顧客ID及び受注先IDの2つのテーブルにリレーションシップを設定しているのですが、 クエリで  [受注T]受注NO及び受注金額、[顧客M]顧客名で抽出したところ、 5000件以上[受注T]にデータがあるはずのものが、1200件ほどしか抽出できませんでした。 ちなみに[顧客M]と[受注用顧客M]というまったく別のテーブルを作成し、 [商品M]受注先1及び2―[受注用顧客M]顧客ID1及び2 とリレーションを作成し、クエリで抽出するとうまくいきました。 しかしこの方法だと、[顧客M]と[受注用顧客M]という2つのテーブルを管理しなければならなくなるので面倒です。 そこで質問です。 同じテーブルの2つの項目対他のテーブルの1つの項目とでは、うまくリレーションが設定できないのでしょうか。 もし出来ない場合、[顧客M]と[受注用顧客M]の2つのテーブルを管理しなければならない訳ですが、 なんとか簡単に管理できる方法(ひとつのテーブルを変更すると簡単にもうひとつが変更できる設定)はないでしょうか。 非常にわかりにくく長い文章で申し訳ありません。 VBA等はさっぱりわかりませんので、普通の設定の範囲内で、できるかどうかよろしくお願いします。

  • このぐるぐるSQLクエリまとまりますか?

    ピボット集計の理解が難しくて難儀してます このような予定表を作るのですが毎月ごとに集計してやるのに 4回問い合わせております。一回でえいやっと投げるにはどう記述しましょう? mysql 5.0です -- 今月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') group by 商品番号; -- 来月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 1 MONTH, '%Y%m') group by 商品番号; -- 再来月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 2 MONTH, '%Y%m') group by 商品番号; -- ささらい月 -- SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 3 MONTH, '%Y%m') group by 商品番号;

  • SQL2005 ストアドUPDATEについて教えてください。

    SQL2005 ストアドUPDATEについて教えてください。 顧客マスタと、売上データがあり、顧客毎の売上データの売上金額の合計を 顧客マスタの累計金額にUPDATEする方法を教えてください。 顧客マスタ・・顧客コード、累計金額 売上データ・・売上日、顧客コード、売上金額 update 顧客マスタ set 累計金額=(select sum(B.売上金額) from 売データ as B where 売上日付>='2010/03/01' and 売上日付<='2010/06/30' group by B.顧客コード) from 顧客マスタ as A,売上データ as B where A.顧客コード=B.顧客コード サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や のエラーが出たり、期間中のすべての顧客の売上合計がセットされたり思うようになりません。 どなたか教えてください。 宜しくお願いします。

  • ACCESSのVBAのSQLを教えてください。

    テーブル1とテーブル2があり、それをUNIONで結合して、リンクさせたOracleのテーブルキーと 結合し、Oracleのテーブルにないキーを検索したいのですが、うまく出来ません。 ACCESSのVBAで作りたいのですが・・どうかご教授願います。 構成  テーブル1   項目名  Key 顧客コード1   名前 テーブル2     項目名   Key 顧客コード1   Key 顧客コード2      名前 Oracleのテーブル  テーブルB     項目名  Key 管理コード  テーブル1の顧客コード1とテーブル2の顧客コード2をUNIONでまとめたものをA1としA1.顧客コードとします それとOracleのテーブルであるテーブルBの管理コードと結合して テーブルBにないA1の顧客コードを抽出するSQL文を作成したいと思います。 (管理コード,顧客コード1,顧客コード2は同じ属性、同じ桁数) SELECT A1.管理コード FROM ( SELECT T1.顧客コード1 as 顧客コード FROM テーブル1 T1 UNION SELECT T2.顧客コード2 as 顧客コード FROM テーブル2 T2 )A1, テーブルB WHERE A1.顧客コード = テーブルB.管理コード AND テーブルB.管理コード IS NULL; エラーにはなりませんが、実行結果は、管理コード 0件です。データ的には、テーブルB側にはテーブル1にはあるがテーブルB側にないデータはあります。

  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • GROUP化した時の最適なSQL文の書き方

    いつも勉強させて頂いています。 GROUP化した時に応答時間がかかるので、 短縮したいのですが、方法をご教示願います。 SQLSERVER2005 EXPRESS VB2008 テーブルA(注文NO、手配日付、品名、手配数) テーブルB(入荷NO、注文NO、入荷数、単価) テーブルAの注文NOに対して複数の入荷があります。 テーブルAの注文NOに対して未入荷の場合も「0」で出力します。 出力(注文NO、品名、入荷累計、平均単価、合計金額) SQL文を書く時に、注文NOでGROUP化してから抽出(手配日付)すると レコード件数が多いため、応答時間がかかってしまいます。 どのような書き方がよろしいでしょうか? この書き方では、時間がかかります。 SELECT テーブルA.注文NO, テーブルA.手配日付, テーブルA.品名, テーブルB2.入荷数, テーブルB2.単価 FROM テーブルA LEFT OUTER JOIN (SELECT 注文No, SUM(入荷数) AS 入荷数, AVG(単価) AS 単価 FROM テーブルB GROUP BY 注文No) AS テーブルB2 ON テーブルA.注文NO = テーブルB2.注文No WHERE (テーブルA.手配日付 = '2008/01/01') すべてのレコードをグループ化してから処理しているため、遅いと思います。 よろしくお願いいたします。

自信とプレッシャー
このQ&Aのポイント
  • 20代フリーランスクリエーターの自信とプレッシャーについての質問
  • 仕事内容は好きだけどプレッシャーや不安で押しつぶされそうになる
  • 他にも上手な人がたくさんいると思うけど、頑張らなきゃという気持ちもある
回答を見る