• 締切済み

COBOL 登録日が最新のデータを取得

課題で「DBからデータを取得する際、登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  MAX(INS_DATE),     --登録日    MAX(SKA_SAKI_CD), --出荷先    MAX(SKA_TYPE) --出荷タイプ INTO :A. INS_DATE,   :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 END-EXEC END-IF ・質問1 まず1件情報を取得する方法にはFETCHがありますが、今回はFETCHは使わないとの指定です。 FETCH以外に同じような処理ができる方法はありますか?? ・質問2 上記の処理だとそれぞれのレコードの最大値がバラバラになって取れてしまうため正確な データを取得できません。  ヒントには副問い合わせを使うというふうにかいてあったのですが、 いまいちnetで調べてもよくわかりません 「データを取得する際最新の登録日のモノを取得する処理」をプログラムで書くとするとどのように書けばよいのでしょうか?? よろしくお願いいたします。

noname#179158
noname#179158

みんなの回答

  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

>××のものを取得する SELECT ・・・ FROM ・・・ WHERE ・・・ これが基本中の基本です。

関連するQ&A

  • COBOL プログラミング

    課題で「DBからデータを取得する際、それぞれの項目から登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  SKA_SAKI_CD --出荷先        ,SKA_TYPE --出荷タイプ INTO :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' AND INS_DATE =(SELECT MAX(INS_DATE) FROM テーブル名 END-EXEC END-IF 上記の処理だとテーブルの中で登録日(INS_DATE)の最大値であるデータ1件だけしか取得できません。 私が実現したい機能はたとえば Aという項目とBという項目があったとして      登録日 A    2011/9/9 A 2011/9/11 A 2011/9/10 B 2011/8/9 B 2011/8/18 B 2011/9/20 Aの中で登録日が最新(最大)である A 2011/9/11 Aの中で登録日が最新(最大)である B 2011/9/20 を取得する処理を実現したいです!! これを実現するにはORDER BY して降順に並べた後に、ROWNUMを使うらしいのですが よくわかりません。どなたかプログラムで書いていただけますかか?? ヒントや考え方でもかまいません よろしくお願いいたします。

  • COBOL プログラミング

    以下の処理でエラーがでてしまっていますがどこが間違っているのかよくわかりません。 文法の間違いを指摘していただけますでしょうか?? ROWNUM と副問い合わせを使用したプログラムです。  ただし全角半角はエラーに含まないものとします。 よろしくお願いいたします。             IF MECIDENPYO_NO NOT = SPACE  THEN   EXEC SQL    SELECT  SKA_SAKI_CD --出荷先           ,SKA_TYPE --出荷タイプ    INTO :A. SKA_SAKI_CD,        :A. SKA_TYPE   FROM (SELECT  SKA_SAKI_CD --出荷先              ,SKA_TYPE --出荷タイプ        INTO   :A. SKA_SAKI_CD,              :A. SKA_TYPE FROM  テーブル名 * WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' * ORDER BY INCE_DATE DESC) WHERE ROWNUM <=1 END-EXEC END-IF.

  • COBOL  最新のデータを1件取得する方法

    プログラミングに関する質問です!  現在課題で「あるデータの登録日(INC_TIME)が最新のデータを1件取得する」という処理を考えています。 ・質問1 まず1件情報を取得する方法にはFETCHがありますが、 FETCH以外に同じような処理ができる方法はありますか?? ・質問2 登録日(INC_TIME)が最新のデータを1件取得する方法として 「最新のデータを取得する処理」をプログラムで書くとするとどのように書けばよいのでしょうか?? よろしくお願いいたします。

  • 開始日と終了日が設定されているデータの扱いについて

    開始日と終了日が設定されているデータの扱いについて教えてください。 すでに複数登録されているデータには、開始日と終了日というフィールドが登録されています。  → "開始日","終了日","箱1","箱2" → "051101","051130","a1","a2" → "051201","051231","b1","b2" 新しいデータを追加する際、すでに登録された期間に被っていた場合はエラー表示させたいのですが、そのやり方がわかりません。 (※12月1日~12月31日までというデータがすでに登録されていた場合、  11月1日~12月15日というデータは登録できない、という感じです) とりあえず下記のようにやったりしているのですが、 どうも思ったように動いてくれません また、SELECTを使うものなのか疑問に思っています。 $start_date = "2005-12-01" $end_date = "2005-12-31" $hoge = "SELECT * FROM table_name WHERE ( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR ( date_start<='"$end_data"' AND date_end>='"$end_data"')"; $db_query = sql_query($hoge,$ID); $array_result = mysql_fetch_array($db_query); if(empty($date_start_check) != TRUE ){ die("この期間内のデータはすでに登録されています。"); } 何卒、良いやり方を教えてくださいm(_ _)mペコリ

    • ベストアンサー
    • MySQL
  • 何をつかえば・・・

    カテゴリーが異なっていたらすみませんm(_ _)m 宜しくお願い致します。 ---------------------------------- EXEC SQL BEGIN DECLARE SECTION;  VARCHAR type[3]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT data_type into :type FROM test_tbl WHERE name='test'; type.arr[type.len]='\0'; if(type.arr == '01'){ /* 処理Aへ */ }else{ /* 処理Bへ */ } --------------------------------------- 上記のようなプログラムがあります。 table_testのnameフィールドが'name'の date_typeフィールドの値を取得します。 取得したdate_typeフィールドの値が'01'なら 処理Aへ、'02'、'03'等なら処理Bを実行したいと 考えています。 ですが、上記の if(type.arr == '01'){ だとエラーが発生しています。 どのようにすればチェックすることができるでしょうか? ちなみに date_typeフィールドはかならずデータがはいっている。 nameはprimary keyの設定のため重複は存在しません。 DBはORACLE、言語はPro*Cです。 どうか宜しくお願い致します。m(_ _)m

  • 判定処理について

    カテゴリーが異なっていたらすみませんm(_ _)m 宜しくお願い致します。 ---------------------------------- EXEC SQL BEGIN DECLARE SECTION;  VARCHAR type[3]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT data_type into :type FROM test_tbl WHERE name='test'; type.arr[type.len]='\0'; if(type.arr == '01'){ /* 処理Aへ */ }else{ /* 処理Bへ */ } --------------------------------------- 上記のようなプログラムがあります。 table_testのnameフィールドが'name'の date_typeフィールドの値を取得します。 取得したdate_typeフィールドの値が'01'なら 処理Aへ、'02'、'03'等なら処理Bを実行したいと 考えています。 ですが、上記の if(type.arr == '01'){ だとエラーが発生しています。 どのようにすればチェックすることができるでしょうか? ちなみに date_typeフィールドはかならずデータがはいっている。 nameはprimary keyの設定のため重複は存在しません。 DBはORACLE、言語はPro*Cです。 どうか宜しくお願い致します。m(_ _)m

  • MAX値が取得できない

    次のような形でMySQLデータベースからデータを取得するように組んでいます mainテーブルのkeyフィールド(INT型)の最大値を取得したいと思っています。 function getResult($query){ $result[result]=mysql_query($query,$this->connect); $result[count]=@mysql_num_rows($result[result]); return $result; } function getSelect($field,$table,$where){ $query="select $field from $table $where;"; $result=$this->getResult($query); return $result; } これが別ファイルにあり、もちろん先に読み込ませ、データベースには接続した状態で、 $results=$db->getSelect("max(key)","main",""); $rows=mysql_fetch_array($results[result]); を実行したのですが、 mysql_fetch_array(): supplied argument is not a valid MySQL のエラーとなり、 'max(key)'とすると 最大値が取得できずそのままmax(key)という文字列が返るだけ max'(key)'とすると mysql_fetch_array(): supplied argument is not a valid MySQL のエラーがでます。 MAXなど大文字に変えても同じ結果です。 maxやavgは今回初めて使ってうまくいかないのですが、今までこの構文で通常のselect * fromとかorder by、limitなど他のものは何の問題もなく動きます。 どこをどうかえてやればMAXを取得できるでしょうか。

    • ベストアンサー
    • PHP
  • アルゴリズムの実装方法

    OPEN cA; OPEN cB; <<outer_loop>> LOOP FETCH cA INTO vA; EXIT outer_loop WHEN cA%NOTFOUND; <<inner_loop>> LOOP FETCH cB INTO vB; EXIT inner_loop WHEN cB%NOTFOUND; IF vA.Pa != vB.Pb THEN --11桁で検索 vB.Pb := SUBSTR( vB.Pb, 1, 11 ); IF vB.b != vA.Pa THEN -- ログ出力 ELSE EXIT inner_loop; END IF; ELSE EXIT inner_loop; END IF; END LOOP inner_loop; 処理exec; END LOOP outer_loop; テーブルのデータはA,Bとも1件だけ作ってやっているのですが、 A.Pa = B.Pbのデータではうまく行きますが、 A.Pa != B.Pbの場合だと、処理execが行われてはいけないのに、 execが行われてしまいます。 うまく動作させるにはどういうアルゴリズムを組めばよいでしょうか? どうぞ宜しくお願いいたします。

  • COBOLの動的SQLについて

    COBOLにおいて、動的にSQLを組みたいのですが、 取得する方法も含めてご教授願いませんでしょうか? 例) 条件により コード=1の場合、 SELECT A.ID,B.NAME FROM ID A,NAME B コード=2の場合、 SELECT A.ID,B.NAME,C.ADDRESS FROM ID A,NAME B,ADDRESS C のように条件により取得する項目も数もテーブルも違います。 この場合でのSQLの組み方とデータを取得する(FETCHの方法)がわかりません。 また、取得する件数も1件ではありません。 よろしくお願い致します。

  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)

専門家に質問してみよう