• ベストアンサー

SQL文について知恵をかしてください!

SQLについて皆さんのお知恵をかしてください 以下の表 tab01から Q01の結果を取り出すSQL文です 検索条件は以下の通り 1) 表tab01から、col1,col2,col3,col4 についてQ01へ出力 2) col2(char型)について "国語","算数","理科"を抽出 3) col4(date型)について「直近」の行のみ抽出    但し、Q01.col2において同じ値が発生する場合は、tab01.col1の値が    最も大きい行を抽出する(例:02,算数と10,算数) この要件を満たすSQL文はどう書けばよいでしょうか? なお、DBはoracle とします tab01 col1 col2 col3 col4  01  国語  80 20011211 02  算数  100 20011208 03  理科  80 20011201 04  国語  90 20011210 05  社会  100 20011209 06  算数  60 20011202 07  体育  80 20011205 08  国語  40 20011207 09  理科  70 20011210 10  算数  100 20011208 Q01 col1 col2 col3 col4 01  国語  80 20011211 10  算数  100 20011208 09  理科  70 20011210 どうかよろしくお願いいたします

  • chaff
  • お礼率92% (78/84)

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

  • ベストアンサー
  • stork
  • ベストアンサー率34% (97/285)
回答No.2

oracleは使用したことがないんですけど、下のSQLで大丈夫でしょう。 主キーはcol1と仮定しました。 ------------------------------ select tab01.* from tab01,     (select max(col1) MaxCol1     from tab01,         (select col2,max(col4) MaxCol4         from tab01         where col2 in('国語','算数','理科')     group by col2) A     where (tab01.col2=A.col2) and (tab01.col4=A.maxcol4)     group by tab01.col2)B where tab01.col1=B.MaxCol1 -------------------------------- もっとすっきりしたSQLがあるんですどoracleで動くか分からないもので......。

chaff
質問者

お礼

舌足らずな説明にも関わらず、ご回答ありがとうございました。 参考になりました。 おかげさまで、徹夜が一回 回避できそうです

その他の回答 (1)

  • MarrowG
  • ベストアンサー率53% (41/76)
回答No.1

SELECT col2, MAX(col1), MAX(col4), col3, FROM tab01 WHERE col2 IN ('国語','算数','理科') GROUP BY col2, MAX(col1), MAX(col4) 出力されるカラムの順番が違いますがこれでお望みの出力が得られると思います。 後は出力側(帳票?)で調節すればよいでしょう。

chaff
質問者

お礼

舌足らずな説明にも関わらず、ご回答ありがとうございました。

関連する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>条件付きで最小値レコードを抽出する方法

    SQLite3.7.5を使っています。 以下<抽出前>の様なテーブルから、col2の値が"FALSE"で(col1=3,4,5の3つ)かつ、col3が最小値(col3=3)であるレコードを<抽出後>のように抽出するSQL文をご教示ください。 <抽出前> col1 | col2 | col3 1 | true | 3 2 | true | 0 3 |false | 3 4 |false | 5 5 |false | 3 <抽出後> col1 | col2 | col3 3 |false | 3 5 |false | 3 自分で考えたSQL文は以下です。 抽出結果は問題ないのですが、同じSELECT文を2回書いていてだいぶ効率悪いことをしているのではないかと思い質問しました。 よろしくお願い致します。 SELECT * FROM (SELECT * FROM test WHERE (col2 = false)) WHERE col3 = (SELECT min(col3) FROM (SELECT * FROM test WHERE (col2 = false)))

  • 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文を教えてください。よろしくお願いします。

  • PHP+MySQLから結果セット取得後の計算方法

    PHP+MySQLから結果セット取得後の計算方法を教えてください。 イメージは以下になります。 以下、testtable とします。 生徒|国語|算数|理科|社会 A 60 80 90 60 B 80 60 70 65 C 95 30 50 90 D 100 95 85 90 そこで、国語が80点以下の生徒を検索し、抽出した生徒の算数平均点数を導きたいのです。 //国語が80点以下の生徒を抽出 $sql="SELECT * from testtable WHERE 国語<=80"; $rst= mysql_query($sql); 上記で国語が80点以下の生徒を検索出来たと思うのです。 イメージは下記になります。 生徒|国語|算数|理科|社会 A 60 80 90 60 B 80 60 70 65 算数の平均を求めるので、(80+60)/2の式を書きたいのです。 平均の2は、mysql_num_rows($rst)で導き出せるのですが、 (80+60)の部分がわかりません。 while ($col = mysql_fetch_array($rst)){ $sum=$sum+$col[算数];} $body.= "平均".$sum/mysql_num_rows($rst)."点"; でよいでしょうか。 ご教授願います。

    • ベストアンサー
    • MySQL
  • グループ内最大値に印を付けるSQL文

    MySQL5 に年度、通し番号が 格納されており、 select year, number from mytable ・・・と抽出すると以下のようになります。 2005 1 2005 2 2005 3 2008 4 2008 5 2008 6 2008 7 2008 8 2010 9 2011 10 2011 11 2011 112 同じ年度グループ内で、最大となる通し番号の行に「myFlg =1」と付けるSQL文をご教示ください。if とか group by とか as myFlg =1 みたいな記述をするのかなと想像するんですが・・・ PHP5のWHILE文でmyFlg = 1となっている行だけを出力し、上記データ例では、 while ($col = mysql_fetch_array($rst)) { if ($col['myFlg']) == '1') { echo $col['year'] . "年の最大番号は、" . $col['myFlg']. "番"; } } を実行することで、以下のような結果を得ることを期待しています。 2005年の最大番号は、3番 2008年の最大番号は、8番 2010年の最大番号は、9番 2011年の最大番号は、112番 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文について

    テーブルにprice1とprice2のフィールドがあります。 単純に安い方から抽出するにはorder by price1でいいのですが price1は通常価格でprice2は特別価格とした場合price1は必ず値が ありますがprice2は任意のものだけ値があります。 price1はもちろんのことprice2は値があるものだけ扱いソートして 抽出するにはどのようなsql文を書けばいいのでしょうか?

    • ベストアンサー
    • PHP
  • SQL文 特定のレコードを抽出したい

    以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。

  • SQL文で

    SQL2000serverで 異なる2つのデーターベースの中にある 別のテーブルの情報を SQL文を使って、抽出する事は出来るのでしょうか? たとえば下記のように「DB-A」「DB-B」と言った 二つのDBの中のそれぞれのテーブルのIDフィールドで リレーションを取ってDB-AのTablA1のFldAの 値(AA)からDB-BのTablB1のFldBの値(あ)を 抽出することはSQL文で可能なのでしょうか? DB-A DB-B TablA1 TableB1 ID FldA ID FldB 1 AA 1 あ 2 BB       2 い 3 CC 3 う 4 DD 4 え

  • JOINを使ったSQL文を作成しようとしています。

    JOINを使ったSQL文を作成しようとしています。 以下の様な3つのテーブルがある場合のSQL文を教えて下さい ※勉強の為、適当なテーブルを作成しましたが、やりたい事は  JOINの中に更にJOINさせたSQL文を作成したいと思ってます 表A  USER_ID(プライマリキー)  NAME 表B  USER_ID(プライマリキー) ※表A.USER_IDと紐着く  BUMON(プライマリキー)  TERM(プライマリキー) 表C  BUMON(プライマリキー) ※表B.BUMONと紐着く  TERM(プライマリキー) ※表B.TERMと紐着く  MEMBER 【取得したい項目】  表A.USER_ID 【抽出条件】  表CのMEMBERの値が'10','20'以外(である表AのNAMEを取得)

  • SQL文を教えてください

    SQL文を教えてください。 以下のテーブルがあります。 T入金 [ID] [名前] [金額] [入金日] 1, 山田, 25000, 2009/01/01 2, 佐藤, 5000, 2009/02/01 3, 山田, 30000, 2009/01/02 4, 佐藤, 45000, 2009/02/02 5, 佐藤, 10000, 2009/02/03 同じ人物で、入金額50000円に至ったときの入金日を 抽出したいと思っています。 上記データだと、 山田さんは入金日2009/01/02、 佐藤さんは入金日2009/02/02、 ということになります。 これを一つのSQL文で抽出できますでしょうか。 ご教授宜しくお願いいたします。 (Access2000のクエリで抽出しようとしていますが、Accessで無理ならSQL Server、MySQL、PostgreSQLでも可です)