• 締切済み

複数条件に当てはまる行の抽出をするSQL文の書き方

SQL文の書き方について教えてください。 商品  横   縦 A    1   3 A    1   4 A    2   5 A    3   5 B    1   3 B    1   4 B    1   5 上記表から、商品毎に、縦が最大(第1優先)で、横が最小の行をとってくるというSQLを書いて、以下のように取り出されるようにしたいと考えています。 商品  横   縦 A    2   5 B    1   5 SQL初心者でうまく書けませんでした。 どうかご指導お願いします。

  • Oracle
  • 回答数7
  • ありがとう数9

みんなの回答

回答No.7

ANo.6に結合条件が抜けていましたので補足します。 select b.商品, min(a.横), b.縦 from table a, (select 商品, max(縦) 縦 from table group by 商品) b where a.商品 = b.商品 and a.縦 = b.縦 group by b.商品, b.縦 これならうまくいくはずです。

回答No.6

select b.商品, min(a.横), b.縦 from table a, (select 商品, max(縦) 縦 from table group by 商品) b group by b.商品, b.縦 こんな感じならいかがでしょうか?

回答No.5

分析関数の使えるオラクルをお使いなら・・ select 商品,横,縦 from ( select x.*,row_numnber() over(partition by 商品 order by 縦 desc,横) R from hoge x ) where R=1 で良いかと思います。 分析関数が使えないのであれば、 select distinct * from hoge x where not exists ( select 1 from hoge y where x.商品=y.商品 and (x.縦>y.縦 or (x.縦=y.縦 and x.横<y.横)) ) な感じで良いかと思います。(未検証ですが)

回答No.4

【方法1】 select 商品,min(横) as 横,縦 from tbl1 where (商品,縦) in(select 商品,max(縦) from tbl1 group by 商品) group by 商品,縦; 【方法2】 select 商品,min(横) as 横,min(縦) as 縦 from tbl1 where (商品,縦) in(select 商品,max(縦) from tbl1 group by 商品) group by 商品; ※min(縦)はmax(縦)でも結果は同じです。

回答No.3

こんな感じでしょうか? select a.商品,min(b.横),a.max縦 from (select 商品,max(縦) as max縦 from test group by 商品) a inner join test b on (a.商品=b.商品 and a.max縦=b.縦) group by a.商品,a.max縦 これでいけると思うのですが、どうでしょうか?

  • dober-o
  • ベストアンサー率59% (260/439)
回答No.2

いくつか書き方はあると思いますが とりあえずこんな感じでどうでしょう SELECT 商品, Min(横), 縦 FROM テーブル WHERE 縦 = (SELECT MAX(縦) FROM テーブル) GROUP BY 商品, 縦; 詳細は「サブクエリ」あたりを検索してみてください

dubro_unico
質問者

補足

WHERE 縦 = (SELECT MAX(縦) FROM テーブル) のように書いてしまうと、テーブルの最大値をとって きてしまうと思います。 商品ごとに最大値が違う場合は成り立たないですよね?

  • investyou
  • ベストアンサー率23% (13/56)
回答No.1

select 商品, min(横), max(縦) from tbl group by 商品

dubro_unico
質問者

補足

これだと以下のようになると思います。 商品  横   縦 A    1   5 B    1   5

関連するQ&A

  • こんなSQL文

    Oracle8.1.7を使用しております。 以下のようなテーブルに対し、1行目と2行目を削除するSQL文を書きたいのですが、思いつきません。どなたか、アドバイスいただけないでしょうか? 表名:A   B | C ――――――――   2 | 10   2 | 1   1 | 10   1 | 1   1 | 11   1 | 2   1 | 1   3 | 10   2 | 3 変数として、P1=1とP2=2があります。(これは、SQL文の中に直接書くものとします。) ここで、SELECT B,C FROM A WHERE B=1;とSELECT B,C FROM A WHERE B=2;を実行すると、次のようになります。   B | C     B | C ――――――――― ―――――――――   1 | 10    2 | 10   1 | 1     2 | 1   1 | 11    2 | 3   1 | 2   1 | 1 ここで、それぞれの表を見ると、Cの値が一致している部分があります。この一致していて、Bが2の行を削除したいのですが、SQL1文では無理でしょうか? 最近、SQLには慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。

  • あいまい条件抽出についてのSQL文について

    あいまい条件抽出についてのSQL文について hiroです。 SQL文について、教えてほしいのですが、 下記のようなDatabaseがあったとします。 tableA:カラムA:ABCDE,BCDEA tableB:カラムB:??C?? この場合、例えば、 SELECT * FROM DataBase WHERE tableA.カラムA like tableB.カラムB みたいな感じで、カラムAのABCDEだけを検索するような仕組みを作ることは 可能でしょうか? ※上のSQL文では引っ張れないのは理解できています。 わかる方がいらっしゃいましたら、SQL文を教えてください。 よろしくお願いします。 環境:Oracle 11g

  • 1列について重複している行を除くかつ,他の列の値で抽出する行を変えたい場合

    SQLSeverを使い,SQL文を作成しているのですが, 下記のA列の重複行を取り除くかつ,B列の「5よりも4」,「4よりも1」,「1よりも2」,「2よりも3」(3>2>1>4>5)の行を抽出したいと考えています.下記の表1を抽出した場合,表2が出るようにしたいです. 表1 A B 1 1 1 3 1 3 1 5 2 1 2 2 2 5 表2 A B 1 3 2 2 もしB列が,5>4>3>2>1の順番ならMAXを使って取り出すことはできたのですが,3>2>1>4>5の場合だと,どんなSQL文にすればよいのでしょうか? よろしくお願いします.

  • SQLにて順列の抽出

    MySQLにてSELECT文にて順列の抽出をしようと試みていますが、順列を出すためのSQL文がわからず困っています。 TABLE1 +-----+-----+-----+-----+ | NUM | A | B | C | +-----+-----+-----+-----+ | 101 | 0 | 4 | 9 | +-----+-----+-----+-----+ | 102 | 2 | 2 | 0 | +-----+-----+-----+-----+ 例えば上記の様なテーブルがあって、NUM=101のA,B,Cを取り出して 049 094 409 490 904 940 のような順列を作り出してPHPから渡した変数D(仮にvar=409)と照らし合わせようと試みていますが、1つの行の中の数字で順列を抽出するSQL文がわからず困っていますので、ご教授願います。

    • ベストアンサー
    • MySQL
  • SQL(SELECT文)を教えてください

    SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付)  Name(名称) Value(値) 20130101      a      10 20130101      b      20 20130101      c      30 20130202      a      5 20130202      b      10 20130202      c      15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。

  • SQL文の構築について教えてください。

    SQL文の構築について教えてください。 こんばんは。Oracle9iのデータベース検索で、どうしてもSQLが思い浮かばないため、質問させていただきます。 ■Table ID    NUM   SIGN 100   1    A 100   2    A 101   1    A 102   1    B 103   1    B 104   1    C 首キーはID、NUMです。 上記のようなテーブルで、 IDが同一かつNUMが最大のもので、 SIGNが同一のレコードで、2件以外のレコードを抽出したいです。 (例表でいうと、ID104のレコードのみが抽出されるようにしたい) すこし急ぎなんですが、SQLが得意でお時間がある方、力を貸していただけないでしょうか。 よろしくお願い致します。

  • SQLで複数列のデータを複数行にしたい

    以下のようなテーブルがあるとします。 column1 a,b,c <- カンマの数は最大50 b,d c,x SQLを実行し以下のような結果を返したいです。 以下の3つのことをすればできそうなのですが複数列を複数行にする方法がわかりません。 1.strtokenで50カラムに分割(カンマ分割) 2. 50カラムを1カラムにする 3.DISTINCTで重複データの削除 結果 a b c d x カンマの数が50あるので、かなり長いSQLになるのですが SELECT文50個をUNIONしてやればできるかなとも考えているのですが 何か良い方法はないでしょうか。 よろしくお願いします。

  • 条件文を使ったグループ出力SQL文

    SQL初心者です。な~んだこんな事くらいと言わず教えてください。 テーブルに A B C ------------ 5 a b 7 c d 4 a d 5 f b ------------ というデータがあります。 これを Bの列については、aとa以外 Cの列については、bとb以外 というようにグルーピングして、合計値を出したいと思っています。 結果として a b 5 a b以外 4 a以外 b 5 a以外 b以外 7 という形の出力イメージです。 調べてみてcase when文を使えばいいなんてことをなんとなく理解しているのですが、group byと組み合わせてどのようにSQL文を書けばいいかわかりません。 SQL Serverを使っています。ご存知の方、ご教授ください。

  • SQL文 複数条件の場合の書き方

    初めて質問します。 下記のようなデータが存在します。 テーブルA NO DATE GYO 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 3 2010/12/02 1 <= 4 2010/12/03 1 4 2010/12/03 2 上記データにて、<=の行の値を取得し変数へ代入したとします。 変数.NO =3 変数.日付 =2010/12/02 変数.GYO =1 上記、変数を元に1件前のレコードを抽出したいのですが SQL文でのいい方法がわかりません。 取得したいレコード 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 どうかお願いいたします。

  • 複雑な抽出条件のSQL文

    まだまだ初心者ですがよろしくお願いします。 以下の条件でDBからデータを抽出したい場合のSQLを 教えていただきたいです。 ・テーブルAがありカラムがA、Bとある。 ・Aは重複できないようになっているがBは重複可。 ・Bが重複しているレコードのAの値が欲しい。 環境はSQLServer2000+VB6.0です 情報が足りないかも知れませんがよろしくお願いいたします。