1つのSQLで2段階の抽出を行いたい
- 1つのSQLで2段階の抽出を行いたい。商品IDごとに最大の単価を持つレコードを取得し、その後数量ごとにグループ化して件数をカウントする方法を教えてください。
- MySQL5を使用しています。テーブル名は「売上げ明細」で、カラムは「商品ID」、「単価」、「数量」です。商品IDごとに単価が最大のレコードを抽出し、その後数量ごとにグループ化して件数をカウントしたいです。
- 求めたい結果を得るためのSQL文を1つの文で記述したいです。具体的には、商品IDごとに最大の単価を持つレコードを取得し、その後数量ごとにグループ化して件数をカウントしたいです。MySQL5を使用しています。
- ベストアンサー
1つのSQLで2段階の抽出を行いたい
恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名: 売上げ明細 カラム: ・商品ID … 売上げ明細なので一意ではありません ・単価 … 同じ商品IDでも、レコードによって単価は異なります ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。
- otyonan
- お礼率100% (1/1)
- MySQL
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
SELECT `数量` ,COUNT(`商品ID`) FROM `売上げ明細` WHERE (`商品ID`, `単価`) IN (SELECT `商品ID`, MAX(`単価`) FROM `売上げ明細` GROUP BY `商品ID`) GROUP BY `数量`
関連するQ&A
- SQL Server を使っています。SQLの質問です。
SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date ================================================================= 1 aaa 001 100 2010/01/01 2 aaa 002 200 2010/01/01 3 bbb 001 105 2010/01/02 4 bbb 002 205 2010/01/02 5 ccc 001 110 2010/01/03 6 ccc 002 210 2010/01/03 7 aaa 001 100 2010/01/04 8 aaa 002 200 2010/01/04 9 bbb 001 105 2010/01/05 10 bbb 002 205 2010/01/05 11 ccc 001 110 2010/01/06 12 ccc 002 210 2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。 7 aaa 001 100 2010/01/04 9 bbb 001 105 2010/01/05 11 ccc 001 110 2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。
- ベストアンサー
- SQL Server
- SQLが分かりません
SQLの初心者です。 ACCESSで売上げ管理をしようと考えています。 売上げに関するテーブルは以下のようになっています。 ●売上げヘッダ テーブル 伝票番号(キー) 売上日 売上げ金額 : ●売上げ明細 テーブル 伝票番号(キー) 枝番(キー) 商品コード 商品名 単価 数量 値引金額 : 値引金額は商品ごとに決まり、値引きしなければ0が、値引きがあればその金額が入ります。 売上げ一覧を表示する時に、以下のようなイメージで、 ワークテーブルを作って、値引きがあれば「あり」と画面に表示させたいのです。 ※無い時は何も表示させません 伝票番号 売上日 売上げ金額 値引き有無 9999 2004/1/1 10,000 10000 2004/1/2 1,500 あり 10001 2004/1/2 20,000 10002 2004/1/3 18,900 10003 2004/1/4 23,500 あり 1回のSQLで実行したいのですが、SQLには詳しくないので、 どのように書けばよいか分かりません。 よろしくお願いします。 値引き区分が無ければ、売上げヘッダを見るだけなのですが、 値引きがあるかどうかは、売上げ明細まで見なければいけないので、 SQLの書き方が分からないのと、以下のようなワークテーブルを 作る必要があると思うのですが、どうなのでしょうか。 ●ワーク テーブル 伝票番号 売上日 売上げ金額 値引き区分
- ベストアンサー
- その他(データベース)
- SQLの書き方(UPDATE文)
SQLの書き方の質問です。 売上Tと商品Mというテーブルがあったとして、 売上Tには商品コード、数量、金額という項目が 商品Mには商品コード、単価という項目が それぞれあったとします。 売上Tの金額=売上T.数量×商品M.単価 この売上Tの金額を更新するのに、update文でできるだけシンプルに高速に動くSQL文を作成したいのですが、どのような書き方がよいと思いますか? 件数は例えば売上が100万件、商品が10万件あった場合を想定して。 以上よろしくお願いいたします。
- ベストアンサー
- Oracle
- SQLを教えてください。
以下に5つのテーブルがあるとします。 (1)全体テーブル ・登録順番号(Key) ・登録名 (2)商品テーブル ・項目コード(Key) ・品名コード(Key) ・商品登録順番号(Key) ・商品サイズ(Key) ・品名 (3)商品単価テーブル ・項目コード(Key) ・品名コード(Key) ・商品登録順番号(Key) ・商品サイズ(Key) ・登録順番号(Key) ・商品単価 (4)新_商品単価テーブル ・項目コード(Key) ・品名コード(Key(Key)) ・商品登録順番号 ・商品サイズ(Key) ・登録順番号(Key) ・新_商品単価 (5)詳細テーブル ・登録順番号(Key) ・品名コード(Key) ・原価項目コード(Key) ・商品数量A ・商品数量B 上記のテーブルから、以下の条件に合致する「(1)の登録名」「(2)の品名」「(4)の新_商品単価×(5)の商品数量※」を取得したい。 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 【条件1】全てAND条件 新_商品単価テーブルの項目コードが100 新_商品単価テーブルの品名コードが50 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※<0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 上記で抽出出来るレコードに加えて、以下 【条件2】全てAND条件 新_商品単価テーブルの項目コードが200~300あるいは400~500 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※=0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A どのようなSQLで抽出できますでしょうか?? DBはAccessです。
- 締切済み
- SQL Server
- これを抽出するSQLを教えてください
どういうSQLを書けばこれが実現出来るのか分からないので教えて下さい。 テーブル名 f_table というテーブルがあります。 このテーブルには、f_id,u_id,day(日付)という三つの列があり、下記のようにデータが入っているとします。 f_id u_id day 1 1 2007/3/8 2 2 2008/1/2 3 2 2008/1/10 4 1 2007/2/12 このf_tableから、各u_idで一番日付の新しいf_idを抽出する(この表の場合f_idの1と3が抽出される)にはどういうSQLで出来るのでしょうか? ※実際の表ではu_idに入っている数字の種類は1と2だけではなく、もっと沢山あります。 ご回答よろしくお願いします。
- 締切済み
- MySQL
- 要求を満たすことのできるSQL文を教えてください
現在、売上の明細を明細IDごとにグループ化し合計値を表示させるプログラムを開発中です。 以下のような要件を満たすSQL文を教えてください。 【もともとの売上の明細のテーブル】 明細ID | NAME | KINGAKU 001 |商品A | 1000 001 |商品B | 500 001 |商品C | 300 002 |商品A | 1000 002 |商品D | 1500 【グループ化後のテーブル】 明細ID | NAME | KINGAKU 001 |商品A | 1800 002 |商品D | 2500 ・明細IDごとに金額を合計する。 ・NAMEの列については、その明細IDの中で最大の金額の商品名を入れる。 ※現在、明細IDごとに金額を合計するのはできているのですが、 もう1つの要件をどのようにすれば達成できるのか分からない 状況です。要件を満たすことのできるSQL文をぜひ教えてください。 よろしくお願いいたします。
- ベストアンサー
- SQL Server
- SQLでうまいことビューが作れない
SQLサーバー2005+マネジメントスタジオでビューを作っています。 以下のデータが存在するときに●のついたデータだけを抽出したいです。 明細IDはユニークとし、明細IDの中で一番日付が新しいものだけを取得したいです。 T-SQLでどのように書けばよいか教えてください。 <データ> 明細ID 日付 111 2010/10/01 111 2010/11/01 111 2010/12/01 ● 222 2010/11/01 ● 333 2010/09/01 333 2010/10/01 ● 444 2010/10/01 444 2010/11/01 444 2010/12/01 ● 555 2010/09/01 ● <出力> 明細ID 日付 111 2010/12/01 ● 222 2010/11/01 ● 333 2010/10/01 ● 444 2010/12/01 ● 555 2010/09/01 ●
- ベストアンサー
- SQL Server
- SQLの相談
SQLの相談です。 以下のようなテーブルについて CREATE TABLE `record`( `id` INT, `timestamp` TIMESTAMP, `point` INT ); 1) id毎に最新5件のデータを抽出 2) 合計pointが420以上のidだけを抽出 したいのですが…。 1)の処理について、うまい解決策を思いつきません。 助言をお願いします。
- ベストアンサー
- その他(データベース)
- 単一SQL文にて抽出可能でしょうか?
単一SQL文にて抽出可能でしょうか? Ver8.3系 予めサブクエリーにて任意の条件にて抽出した店データのIDの値を基に、 商品データを抽出するのですが、その商品は、お店毎にランダムに1件抽出される。 <抽出例> 例えば、サブクエリーにて5店舗対象となり、そのお店紐付けられる商品は お店毎にランダムに1商品しか抽出されない。 店ID、商品ID 000001、100001 000002、305001 010000、200010 011111、300001 020000、150000 色々試しているのですが、うまくいきません。 お詳しい方、ご教授願えないでしょうか? よろしくお願いします。
- ベストアンサー
- PostgreSQL
- SQLコマンドによるデータ抽出について
例えば 商品マスタという商品ID、商品名、単価のフィールドを含んだテーブルと 販売履歴というID、商品ID、販売日時というフィールドを含んだテーブルがあります。 各商品の一番最後に売れた販売日時を知るために この2つのテーブルからSELECT文で商品ID、商品名、販売日時の フィールドを結果として返すSQL文を作りたいです。 各商品なので全く売れていない商品でも商品IDと商品名だけは結果に欲しいです。 どなたかSQLに詳しい方、教えてください。
- ベストアンサー
- Visual Basic
お礼
迅速なご回答ありがとうございます。 おかげさまで期待通りのデータが得られました。 (-人-)ありがたや~