• ベストアンサー

SQLの作成の仕方

SQLを学びだしたばかりの初心者です。 皆様のお知恵を貸して下さい。 商品 サイズ 金額 AAA S     100 AAA M     200 BBB S     300 CCC M     200 ↑このように登録されたDBがあるとします。 これから下記のような表を作りたいのですが 上手くSQLが書けません。 (追加)            商品 サイズ 金額 最小サイズ AAA S     100    S AAA M     200    S BBB S     300    S CCC M     200    M MIN関数とGROUP BYを使ってやればいいと思うのですが・・。 どうか宜しくお願いします。

  • Oracle
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
回答No.3

最近のオラクルなら、オラクルらしく分析関数で書くと スマートに書けるような気がします。 select 商品,サイズ,金額, min(decode(サイズ,'S',0,'M',1,'L',2)) over(partition by 商品 rows between unbounded preceding and unbounded following) as 最小サイズ from テーブル 古いオラクルや他のRDBの場合は、他の方が書かれているように自己結合と なりますけどね。 select a.商品,a.サイズ,a.金額,b.最小サイズ from テーブル a, (select 商品,min(decode(サイズ,'S',0,'M',1,'L',2)) 最小サイズ from テーブル group by 商品) b where a.商品=b.商品 相応の件数がある場合は、テーブルの探査量の問題で、分析関数の方が速いと思います。

その他の回答 (2)

回答No.2

group byが抜けていたので訂正。動くかは未確認です。 select tbl1.商品, tbl1.サイズ, tbl1.金額, (select tbl3.最小サイズ from (select subtbl1.商品, min(decode(subtbl1.サイズ, 'S', 1, 'M', 2, 'L', 3)) as 最小サイズ from tbl1 subtbl1 where tbl1.商品 = subtbl1.商品 group by subtbl1.商品) subtbl12, (select subtbl2.商品, decode(subtbl2.サイズ, 'S', 1, 'M', 2, 'L', 3) as サイズ区分, subtbl2.最小サイズ from tbl1 subtbl2 where tbl1.商品 = subtbl2.商品) subtbl22 where subtbl12.商品 = subtbl22.商品 and subtbl12.最小サイズ = subtbl22.サイズ区分 ) as 最小サイズ from tbl1

回答No.1

select tbl1.商品, tbl1.サイズ, tbl1.金額, (select tbl3.最小サイズ from (select subtbl1.商品, min(decode(subtbl1.サイズ, 'S', 1, 'M', 2, 'L', 3)) as 最小サイズ from tbl1 subtbl1 where tbl1.商品 = subtbl1.商品) subtbl12, (select subtbl2.商品, decode(subtbl2.サイズ, 'S', 1, 'M', 2, 'L', 3) as サイズ区分, subtbl2.最小サイズ from tbl1 subtbl2 where tbl1.商品 = subtbl2.商品) subtbl22 where subtbl12.商品 = subtbl22.商品 and subtbl12.最小サイズ = subtbl22.サイズ区分 ) as 最小サイズ from tbl1 こんなかなーーー・・・。試す環境が無いので確認とれてません。 文字をMIN()すると、MよりSの方が文字コードの関係で でかくなってしまいますよ多分。

関連するQ&A

  • SQLの集計について教えてください。

    環境はoracle9iです。 ■テーブルの構成 |年度|月|部署コード|商品コード|金額| ■テーブルの内容 |2010|01|AAA|001|1000| |2010|02|AAA|001|2000| |2010|01|AAA|001|3000| |2010|01|AAA|002|3000| |2010|02|BBB|003|4000| |2010|01|CCC|001|5000| |2010|03|CCC|001|6000| 上記のようなテーブルがあり、 これを年度,月,部署コード,商品コードでサマリした値を表示したいです。 と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 そこに年度,部署コード,商品コードでサマリした 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) ■抽出結果の構成 |年度|月|部署コード|商品コード|金額|累計金額| ■抽出結果の内容 |2010|01|AAA|001|4000|6000| |2010|02|AAA|001|2000|6000| |2010|02|BBB|003|4000|4000| |2010|01|CCC|001|5000|11000| |2010|03|CCC|001|6000|11000| GROUP BYと別の集計単位で列を作ることが可能か、 可能であればどのようなSQLを書くべきか、 というところを教えてください。

  • SQLServerにおける累積、累計取得SQL

    以下のような売上テーブルがあった場合に、 ◎売上累計金額を会社毎、売上日順に取得する SQLをお教えください。 Oracleでいうところの以下のような分析関数はありますでしょうか? sum(売上金額) over(partition by 会社名 order by 売上日) 例:売上テーブル 会社名  売上日   売上金額 ◎売上累計金額(会社別) (1)AAA  2005/12/01 1000  1000 (2)AAA  2005/12/02 200   1200 (3)AAA  2005/12/04 300    1500 (4)AAA  2005/12/10 500    2000 (5)BBB  2005/12/05 300    300 (6)BBB  2005/12/09 200    500 (7)BBB  2005/12/20 100    600 (8)CCC  2005/12/05  500  500 (9)CCC  2005/12/08 1000  1500

  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

  • PL/SQLでの集計とテーブルの結合の仕方

    いつもお世話になっております。 pl/sqlでの処理なのですが、タイトルのとおり テーブルの結合と集計で分からないところがあり、 こちらで質問させていただきました。 処理内容は あるグループでレコードを集計し、 そのグループが重複する他のテーブルと結合したいと 考えております。 【テーブル1】 (班) (回数) (秒) aaa| 10| 100 aaa| 20| 200 bbb| 10| 150 bbb| 20| 100 ccc| 10| 100 ccc| 30| 250 : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) aaa| 30| 300| 2 bbb| 30| 250| 2 ccc| 40| 350| 2 : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) 200904| aaa| 30| 300| 2000 200905| bbb| 30| 250| 3000 200904| ccc| 40| 350| 4000 : : : : : という形にしたいのですが可能でしょうか? 例に挙げたのは3件しかありませんが テストデータは1万件以上ありそれを処理します。 初心者なので、テーブルの結合の仕方、 集計の仕方が分からず行き詰っております。 どなたか、お力を貸していただけないでしょうか。 よろしくお願いいたします。

  • オラクルSQLの累計値取得方法について

    教えてください。 3日ほど、悩んでおります。 オラクルのSQLにおいての累計値の取得がどうしてもできません。 会社毎に、毎日の売上累計をSQL一発で取得したいです。 下記例の【★売上累計金額(会社別)】の箇所をレコード毎につみあげて取りたいのですが・・ ただ、対象期間が6ヶ月(約180日)あるので、レスポンスが重要視されています。 なにか、いい方法があれば教えていただきたいです。 例:売上明細テーブル 会社名 売上日  売上金額 ★売上累計金額(会社別) (1)AAA 2005/12/01 1000    1000 (2)AAA 2005/12/02 200   1200 (3)AAA 2005/12/04 300   1500 (4)AAA 2005/12/10 500   2000 (5)AAA 2005/12/03 100   2100 (6)BBB 2005/12/05 300   300 (7)BBB 2005/12/09 200   500 (8)BBB 2005/12/20 100   600 (9)BBB 2005/12/25 1200   1800 (10)CCC 2005/12/05  500    500 (11)CCC 2005/12/08 1000    1500 以上、なんとかご教授お願いいたします!

  • SQLでどのように書いたら教えてください。

    列Aに「aaa.co.jp」「bbb.com」「ccc.ne.jp」「ddd.jp」「eee.it」があり列Bでドメインの判別をしたいと考えています。ドメインは「co」「com」「ne」「jp」「その他」の5種類があり、aaa.co.jp→co、bbb.com→com、ccc.ne.jp→ne、ddd.jp→jp、eee.it→その他となるようにしたい時、どのようなSQLを組めばいいのでしょうか?ややこしいのは、aaa.co.jpの時は「jp」ではなく「co」で、ccc.ne.jpも「jp」ではなく「ne」で判別しますが、ddd.jpの場合は「jp」になります。実際にはもっと膨大な種類のドメインを判別するのですが、考え方や使うべき関数、SQLを教えてもらえないでしょうか?アクセス解析のプログラムなのですが行き詰ってしまいました。 分かりにくい説明ですいません。

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • 重複レコードの抽出について

    以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。 mail | name ----------- aaa | 01 aaa | 01 aaa | 01 bbb | 02 bbb | 02 bbb | 01 ccc | 01 ccc | 01 ccc | 02 select * from test where mail in (select mail from test where mail group by mail having count(mail)>1) 上記のSQL文だと以下のデータが取得されてしまいます。 ↓ mail | name ----------- aaa | 01 ○ aaa | 01 ○ aaa | 01 ○ bbb | 02 × bbb | 02 × ccc | 01 × ccc | 01 × ○印のみ取得したいのですが、 SQL文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。

  • SQL抽出順番

    SQLの質問なんですが 以下のSQLがあるとします。 select カラムA、カラムC from test_table where in ('AAA','BBB','CCC'); ※条件はカラムAの値を使用しています。 結果が AAA 111 BBB 222 CCC 333 と出るとします。 下のように条件を変えたとき where in ('BBB','CCC','AAA'); BBB 222 CCC 333 AAA 111 と抽出と変わるようにしたいのですが、 (in句の左から順番にレコードが抽出したいです) 何か良い方法はありますでしょうか? rowid順で出力されてしまうのでしょうか? 以上です。 よろしくお願いします。

  • 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 どなたかご指導ください。 よろしくお願いします。