• 締切済み

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を使うらしいのですが よくわかりません。どなたかプログラムで書いていただけますかか?? ヒントや考え方でもかまいません よろしくお願いいたします。

noname#179158
noname#179158

みんなの回答

  • seastar3
  • ベストアンサー率69% (99/142)
回答No.1

COBOLの文法というよりは、SQLの組込処理の記述がポイントのようですね。 GROUP BY 句を応用して、各グループの最新日付のデータを抽出するSQL文を記述する必要があります。 次のオラクルハリケンミキサーさんの実験が参考になります。 http://www.seiji-tsubosaki.net/OHM/CONTENTS/SQL_INVESTIGATION/11_item.htm

関連するQ&A

  • 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で調べてもよくわかりません 「データを取得する際最新の登録日のモノを取得する処理」をプログラムで書くとするとどのように書けばよいのでしょうか?? よろしくお願いいたします。

  • 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の動的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件ではありません。 よろしくお願い致します。

  • accessのデータ更新について

    テーブルBの内容をテーブルAに反映させようとしてます。 ●テーブルBの内容 顧客コード 登録日 ステータス ステータス更新日 1 2012/01/01 1 2012/01/01 1 2012/01/01 2 2012/01/02 1 2012/01/01 3 2012/01/04 1 2012/02/02 1 2012/02/03 1 2012/02/02 2 2012/02/04 1 2012/02/02 3 2012/02/06 1 2012/02/02 4 2012/02/08 ●テーブルAの内容 顧客コード 登録日 ステータス 1 2012/02/02 1 2012/01/01 それぞれのテーブルの「顧客コード」、「登録日」をキーにし、テーブルBのステータス更新日の最新の日付のステータスをテーブルAに反映させたいのですが、うまく最新の日付のデータを取得してくれません。どうすれば正しくデータを反映することができますでしょうか? UPDATE b INNER JOIN a ON (b.登録日 = a.登録日) AND (b.顧客コード = a.顧客コード) SET a.ステータス = [b]![ステータス]; という感じにしてます。 処理後結果のテーブルAは、以下になります。 顧客コード 登録日 ステータス 1 2012/02/02 3 1 2012/01/01 2 本当は、以下にしたいのですが、、、、 顧客コード 登録日 ステータス 1 2012/02/02 4 1 2012/01/01 3 テーブルBの並び順をステータス更新日の降順や昇順にかえたりし、何度となくやりましたが、うまくいかない状況です。 なにとぞよろしくお願いいたします。

  • COBOL85のコーディングについて

    COBOL85のコーディングについて教えてください。 以下のようなレコードを持つテーブルで、CD1="B"のレコードを、(1)→(2)→(3)の降順で読み込むには、どのようにコーディングすれば可能でしょうか? コーディング例をお願いします。   CD1|CD2|DATE   ――――――――――――――――   A  |1  |20120101   A  |2  |20991231 (3) B  |1  |20120101 (2) B  |2  |20131231 (1) B  |3  |20991231   C  |1  |20120101   C  |2  |20991231

  • ある条件でのSQLの取得方法について

    以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー   項目1 10     X 20     Y ・テーブルB キー  項目2  項目3 10     5    C 10     6    D 12     6    E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は  別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、  複数件あるかも知れません。  無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと  同じレコードに、項目2が同じデータの情報を出力します。  項目2が同じデータが無い場合はこの情報は出力しません。  項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー  フラグ   項目1  項目2  項目3   項目2が同じキー  項目2が同じ値 10  テーブルA   X 10  テーブルB         5    C 10  テーブルB         6    D        12            E 20  テーブルA   Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?

  • オラクルのSQLで複数テーブルの一括件数取得

    テーブルAとテーブルBがあって、それぞれに 項目Aがあり、 その項目Aが 0の件数を取得したのいですが、高速化のため 1度のSQLで 取得したいのです。 どのようにすればいいでしょうか? 例 テーブルAの項目A 0 1 2 0 テーブルBの項目A 1 0 0 2 0 この場合、テーブルAが 2件で テーブルBが 3件となります。 それぞれ別々に取得するやり方は わかります。 それぞれ別々に取得する(2回する)のを1回で取得するようにすれば 少しは 速くなるのでは ないのかと思いすが、 いかに取得したら 速くなるのか 教えてください。

  • SQLについて

    以下のSQLを作成したいのすが 実現方法が判りません お助けください。 環境:SQL SERVER2008 実現したいこと 明細テーブルの挨拶項目にマスターA・Bからメッセージを取得したい。 基本はAマスターのメッセージを取得 コードを1つのグループとして扱いマスタBに合致する場合 マスタAでは無くてマスタBのメッセージを取得したいです。 よろしくお願いいたします。 具体的に取得したい結果は ☆望む結果になります。 コードは必要ないのですが、 判別の為一緒に表示いたしました。 マスタA 挨拶 メッセージ 000601 おはよう 000602 こんにちは 000603 こんばんは 000604 お休みなさい 000605 就寝中 マスタB(最大3つまでの組合せです) 挨拶1 挨拶2 挨拶3 メッセージ 000601 000602 000603 おはようございます。 000602 000603 こんにちは・こんばんは 明細テーブル コード 挨拶 000153 000601 000153 000602 000153 000603 000154 000602 000154 000603 000155 000604 000156 000605 ☆望む結果 コード メッセージ 000153 おはようございます。 000154 こんにちは・こんばんは 000155 お休みなさい 000156 就寝中

  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE

  • 複数テーブルからのMAX内容の取得

    OracleのSQLに関する質問です 複数のテーブルから最大値を取得したいのですが Aテーブル 商品NO 更新日  更新時間 AAAAAA 20080101 010000 BBBBBB 20080201 020000 CCCCCC 20080131 030000 Bテーブル 商品NO 更新日  更新時間 XXXXXX 20070101 040000 YYYYYY 20070201 050000 ZZZZZZ 20080201 010000 上記2テーブルから更新日、更新時間が最大のデータを取得する方法を教えてください、商品NO等の他の項目を取得する必要はありません 上記のサンプルではAテーブルの'20080201'、'020000'が取得できる方法となります 以上 初歩的な内容ですがよろしくお願いいたします