• ベストアンサー
  • すぐに回答を!

SQL MAX関数を検索条件にする。

SQL MAX関数を検索条件にする。 わかる方がいれば助けてください。 下記のようなデータのテーブルあります。   ID        品番      金額          日付 OUTLET 210  00182-1080   5600         20090915 OUTLET 214 00182-1080   5600         20090916 OUTLET 217 00182-1080   5600         20090917 OUTLET 50 00182-1080   5600         20090609 OUTLET 437 00191-1082   3300         20100305 BLK09SS703 00191-1082   5500         20090703 OUTLET 141 00191-1082   5500         20090717 OUTLET 170 00191-1082   5500         20090806 このテーブルデータの各品番について最新日付のデータのみを出力したいのですが、 方法がわかりません。group byでHAVING検索なども試しましたがうまくいきませんでした。 <抽出したいデータ>   ID        品番      金額          日付 OUTLET 217 00182-1080   5600         20090917 OUTLET 437 00191-1082   3300         20100305 どなたかお願いします。 前にも同じような質問をさせていただきましたが、 解決できずにこまっています。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数2726
  • ありがとう数24

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

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

下記のSQL文を参照してください。 SELECT TB1.ID , TB1.HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ] TB1.KINGAKU , -- 金額(KINGAKU) [ NUMBER(7,0) NULL ] TB1.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ] FROM TEST_TABLE TB1 INNER JOIN( SELECT HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ] MAX(HIZUKE) AS HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ] FROM TEST_TABLE GROUP BY HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ] ) TB2 ON TB1.HINBAN = TB2.HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ] AND TB1.HIZUKE = TB2.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ] 注:SQL文実行の結果は添付画像を参照してください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

すいません。 Group Byの存在を忘れてました。 無事解決しました。 ありがとうございます。 

質問者からの補足

ご回答ありがとうございます。 大変参考になりました。 この方法でできたと思ったんですが、新たに問題が出てきてしまいました。 TB1のレコードで稀に最新日付が同一のものがあり、その品番についてINNERJOINすると あたりまえですがその品番だけ2行抽出されてしまいます。 このような品番が出た場合、金額が安いほうをとってきたいのですが、 なにか方法はありますでしょうか? 品番が重複するようなことはどうしても避けたいのです。 お手数ですがなにかよい方法があれば教えていただきたいです。

関連するQ&A

  • SQL HAVING句?集約関数について

    SQL HAVING句?集約関数について 現在、SQLを書いているのですが、集約関数についてわからないことがあります。 下記のようなテーブルについて   品番    SEC   SUB 倉庫コード 日付 金額 0102A255-**** 100 001 412200 64 20100501 5700 0102A255-**** 100 001 412200 64 20091226 7980 0102A255-**** 100 001 412200 64 20091001 9400 品番をひとつに絞り、かつ最新日付とその金額をもってくるためにはどうしたらいいでしょうか? ようは一番上のレコードのみ抽出したいということです。 どなたかお願いします。

  • 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 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • これを抽出する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だけではなく、もっと沢山あります。 ご回答よろしくお願いします。

その他の回答 (1)

  • 回答No.2
  • root139
  • ベストアンサー率60% (488/809)

相関サブクエリを使っても出来ますね。 テーブルの定義は1の方と同じとして、下記の様になります。 例) -------------------------------------------------- SELECT * FROM TEST_TABLE a WHERE NOT EXISTS ( SELECT 1 FROM TEST_TABLE b WHERE a.HINBAN = b.HINBAN AND a.HIZUKE < b.HIZUKE ) ------------------------------------------------------ 「各品番について最新日付のデータ」は以下の様に読み替えられます。 「『同じ品番でより新しい日付の別のデータ』が無いデータ」 これをSQLで表現していることになります。

参考URL:
http://codezine.jp/article/detail/1076?p=2

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 初めて知る関数です。 なんか便利そうですね。 後学のために頭の中にとどめておきます。 また大変申し訳ないんですが、新たな問題が出てきてしまいました。 補足欄に追記させていただきましたので、 お時間があれば助けていただきたいです。 よろしくお願いします。

関連するQ&A

  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • SQLの範囲指定検索の質問です。

    金額100円~300円 というデータがそれぞれテーブル(test1)のカラムに pay_under:100 pay_limit:300 という形で入っています。 これを検索画面で 金額:「  」 の中に 100から300の値を入れて検索した場合に 上のデータが抽出されるSQLの書き方を教えてください。 例) 金額:「150」→ 抽出 金額:「300」→ 抽出 金額:「60」 → 抽出されない

    • ベストアンサー
    • MySQL
  • バッチ処理SQL文でmax関数を使った古いデータの削除

    バッチ処理で1年前の古いデータの削除をしたいのですが日付が20060401のような数値になっています。 MAX関数を使ってSQL文を作ってみたのですが動きません(^_^;) ***BATファイル*** c:\mysql\bin\mysql -u user -p**** <c:\mysql\juten-del.sql ***SQL文*** DELETE FROM 重点商品管理.重点商品 WHERE 日付 <= (MAX(日付)-10000) かねやんMYSQLADMINを使うと≪Invalid use of group function≫とエラーメッセージが出ます。 【日付 <= 20050301】のように書くと削除されるので【日付 <= (MAX(日付)-10000)】の部分が間違っていると思うのですが・・・それともバッチの作り方が悪いのでしょうか? どなたかよろしくお願いします<(_ _)>

    • ベストアンサー
    • MySQL
  • SQLでMAXを使った

    □オラクルのデータ(テーブル名:abc) ------------------------------------------------- 列名 x y z date qq ------------------------------------------------- a a a 2003/12/1 a b b b 2003/01/01 b a a a 2003/12/14 b b b 2005/12/30 □結果 ------------------------------------------------- 列名 x y z date qq ------------------------------------------------- a a a 2003/12/14 a b b b 2005/12/30 b 上の結果を出したい時、SQLで "SELECT x,"_    & "y," _    & "z," _    & "Max(date) AS abc2, qq FROM abc" _    & "GROUP BY x," _    & "y," _    & "z," _ & "qq" としたらエラー「要求された名前、または序数に対応する項目がコレクションで見つかりません」 と出てしまいます。 データベースはオラクルです。 正しい書き方を教えて下さい。

  • sql 集計結果の抽出方法を教えてください

    金額テーブル(会社名、金額)と詳細テーブル(会社名、日付、金額)があり 金額テーブル A社 100円 詳細テーブル A社 2011/1/1 10円 A社 2011/1/2 10円 A社 2011/1/3 50円 A社 2011/1/4 20円 A社 2011/1/5 10円 A社 2011/1/6 10円 詳細テーブルの金額を一件づつ合計していき、金額テーブルの金額を超えた時の 詳細テーブルの日付を抽出するSQLを教えてください。 上記データの2011/1/5を抽出したいのです。 宜しくお願いします。

  • SQLの結合条件について

    SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。

  • Groupの中の条件に合致するデータを抜き出したい

    Groupの中の条件に合致するデータを抜き出したい いくつかのテーブルからGroupでくくったデータを抜き出しました。 その中から条件に合致するデータに絞りたいのですが、 思った結果となってくれません。 DB:MySQL 5.1.50 以下のようなことをしたいと考えています。 [元のデータ] ID   | 日付   | 担当   | 金額 A-01  |2010-09-01 |Angas    |1000 A-01  |2010-08-31 |Mayor    |1500 A-01  |2010-08-25 |Angas    |2000 B-01  |2010-08-30 |Roger    |1350 B-01  |2010-09-01 |Angas    |2000 B-01  |2010-08-20 |Roger    |1350 [結果として欲しいデータ] ID   | 日付   | 担当   | 金額 A-01  |2010-09-01 |Angas    |1000 A-01  |2010-08-31 |Mayor    |1500 B-01  |2010-08-30 |Roger    |1350 B-01  |2010-09-01 |Angas    |2000 ちょっとデータ例が貧弱ですが・・・ IDと担当でグループ化した中で、日付が最も大きいレコードを抜き出したい。 というのが目的です。 どのようにSQLを書くと良いのでしょうか? IDと担当でグループ化までは書けたのですが、 「グループのデータの中で日付で降順としたものの最新」というのを どのように書いたものか悩んでいます。 PS.こういうSQLの書き方で悩んだ時に、どうやって情報を集めると 良い情報に出合えるかの助言も頂ければ助かります。 よろしくお願いします。

  • GROUP BY , MAX の使用法に関して

    いつもお世話になります。 GROUP BY , MAX の使用法に関して質問です。 USERCDとKYOUTUNOでグルーピングをしてSEQの最大値のレコードを抽出しようとしています。 以下のようなSQL文の場合ですとBIKOUがないレコードを抽出する事が出来るかと思います。 【select USERCD , KYOUTUNO , MAX(SEQ) from テーブル1 group by USERCD , KYOUTUNO】 そこで、BIKOU も同時に抽出したいのですが、BIKOUを選択列に入れると「GROUP BYの式ではありません。」のエラーが出ます。 「そりゃそうだ」だと思うのですが、どうのようにすればSQL文を作れば結果のようなレコードを抽出出来るのでしょうか? よろしくお願いします。 ◆テーブル1のデータ USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 1 あああああ 100 100 2 いいいいい 100 100 3 あいうえお 222 200 1 AAAAA 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 1 ううううう 44444 100 2 えええ ◆結果 USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 3 あいうえお 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 2 えええ ■ORACLEのバージョン  Oracle9i

  • SQLでの複数検索条件の書き方を教えて下さい。

    SQLを使うことが初めての、本当にど素人です。 質問の仕方自体おかしいかもしれませんが、どなたか下記条件でデータ抽出するSQLの書き方を教えて下さい。 【抽出条件】 1つの商品購入テーブルから、5月と6月に購入してて、7月と8月に購入していない、東京都と神奈川県在住の方の顧客IDと購入商品すべてを抽出できないでしょうか? カラムは、顧客ID、購入月、顧客都道府県、商品コードとそれぞれ分かれています。 この内容で、ご回答いただけますでしょうか? 何卒よろしくお願いします。

  • デルファイでのSQL文について

    まだ初心者なのでよく分かりません。SQL文について教えてください。 テーブル名:table1 データ:   コード   日付     種類   備考 (1) 1111   2003/12/11  book  AAA (2) 2222   2003/11/10  pencil BBB (3) 2222   2003/12/10  pencil CCC (4) 2222   2003/12/20  cap   DDD 上のようなデータがあった場合、コードと種類が同じで日付が最新のデータを取りたいのですがSQL文でできるでしょうか? 上の場合だと(1)と(3)と(4)のデータを抽出したいのです。GROUP BYですると備考がとれませんでした。 どうぞよろしくお願いします。