• ベストアンサー

SQLの抽出方法について

あるテーブルに以下のカラムがあります。 店舗コード,売上日,金種コード,履歴番号,売上金額 プライマリキー(店舗コード~履歴番号) このテーブルには、店舗、売上日、金種コードごとの売上金額が履歴で管理されています。 ・データイメージ 0001,2004/04/01,01,0,1000 ・・・1行目 0001,2004/04/01,01,1,1100 ・・・2行目 0002,2004/04/01,02,0,500 ・・・3行目 0003,2004/04/01,03,0,2000 ・・・4行目 0003,2004/04/01,03,1,2010 ・・・5行目 0003,2004/04/01,03,2,1500 ・・・6行目 0001,2004/04/02,01,0,800 ・・・7行目      ・      ・ このデータから、売上日を指定して、 全店舗の金種ごとの履歴番号が最大のレコード(2,3,6行) を取得したいのですが、いいSQLが思いつかないので、ご存知の方教えてください。

  • Oracle
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 わかりやすさを第一にすると、ビューを作るのが一番わかりやすいですね。 CREATE VIEW TABLE_MAX_RIREKI(店舗コード, 売上日, 金種コード, 最大履歴) AS SELECT 店舗コード, 売上日, 金種コード, MAX(履歴番号) FROM TABLE GROUP BY 店舗コード, 売上日, 金種コード  こう定義しておくと、抽出クエリーは、次の通り。 SELECT A.店舗コード , A.売上日 , A.金種コード , A.履歴番号 , 売上金額 FROM TABLE A, TABLE_MAX_RIREKI B WHERE A.店舗コード = B.店舗コード AND A.売上日 = B.売上日 AND A.金種コード = B.金種コード AND A.履歴番号 = B.最大履歴  くらいの感じでしょうか。  ここからは、データベースの指定がないので、機種固有になります。  一つのクエリーの形でどうしても作りたいなら、ということで、考え方だけ。  もし、FROM句にSELECT文が書くことが許されてましたら、FROM TABLE A, TABLE_MAX_RIREKI B のTABLE_MAX_RIREKIの所に、ビューの定義のセレクト文を書けばいけるでしょう。  WHERE句のサブクエリーで、リスト形式の比較(複数フィールドの比較)が許されているなら、ビューの定義をサブクエリーの形に取り込んで、WHERE句で、(店舗コード , 売上日 , 金種コード , 履歴番号) と比較してください。  これもダメなら、WHERE句で、 店舗コード||売上日||金種コード||履歴コード と、ビューの定義のフィールドを同じ形に置き換えたものを返すサブクエリーとの比較でいけると思います。(要するに、文字列の形で連結して一つのフィールドとみなしているだけですね。)  

mikmik_a
質問者

お礼

ご回答ありがとうございます。 CREATE VIEWの部分をサブクエリにしてうまくいきました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

売上日,店舗コード,金種コード,履歴番号でレコードを特定できるなら、 select T.* from T,(select 売上日,店舗コード,金種コード,max(履歴番号) 履歴番号 from T where 売上日=? group by 売上日,店舗コード,金種コード) TMAX where T.売上日=TMAX.売上日 and T.店舗コード=TMAX.店舗コード and T.金種コード=TMAX.金種コード and T.履歴番号=TMAX.履歴番号; ――でどうでしょう。

mikmik_a
質問者

お礼

ご回答ありがとうございます。 とても参考になりました。

関連するQ&A

  • SQL 特定のカラムが最大値のレコード取得

    初心者です。SQL文で困っています。 どなたかご教授頂けたらと思います。 環境は、SQL SERVER 2000です。 特定のカラムが最大値のレコードのみ取得したいです。 たとえば、以下のようなデータがあるとします。 コード、履歴番号で主キーとします。 コード|履歴番号 |金額 0001 | 1 | 12000 0001 | 2 | 12001 0001 | 3 | 12002 0002 | 1 | 12000 0002 | 2 | 12001 0002 | 3 | 12002 0003 | 1 | 12000 0003 | 2 | 12001 この場合に、コード毎に履歴番号が最大のレコードのみを取得したいです。 理想の結果は以下になります。 コード|履歴番号 |金額 0001 | 3 | 12002 0002 | 3 | 12002 0003 | 2 | 12001 以上です。よろしくお願いいたします。

  • プライマリキーのみを変更して、複数行insertする方法

    こんにちは。 oracle(9i)のテーブルにinsertを行おうと思っているのですが、 困っているので質問させていただきます。 Aテーブルに5カラムあるとします。 カラム1はプライマリキーです。 例えば、1レコードが下記のようになっているとします。 カラム1 カラム2 カラム3 カラム4 カラム5 ---------------------------------------------- 001 あああ いいい ううう えええ プライマリキーに1を足して、他のカラム2から5までは同様の内容で insetをしたいと思っています。 つまり、下記のようなレコードになります。 002 あああ いいい ううう えええ 003 あああ いいい ううう えええ このようにプライマリキーのみを変更して200レコードくらいを insertしたいと思いますが、どのようにすればよいでしょうか。 できれば、PL/SQLかSQLのスクリプトで実行したいと思います。 ご存知の方、ご教授願います。 よろしくお願いいたします。

  • SQLが分かりません

    SQLの初心者です。 ACCESSで売上げ管理をしようと考えています。 売上げに関するテーブルは以下のようになっています。 ●売上げヘッダ テーブル   伝票番号(キー)   売上日   売上げ金額    : ●売上げ明細 テーブル   伝票番号(キー)   枝番(キー)   商品コード   商品名   単価   数量   値引金額    : 値引金額は商品ごとに決まり、値引きしなければ0が、値引きがあればその金額が入ります。 売上げ一覧を表示する時に、以下のようなイメージで、 ワークテーブルを作って、値引きがあれば「あり」と画面に表示させたいのです。 ※無い時は何も表示させません 伝票番号  売上日  売上げ金額 値引き有無 9999 2004/1/1 10,000 10000 2004/1/2 1,500 あり 10001 2004/1/2 20,000 10002 2004/1/3 18,900 10003 2004/1/4 23,500 あり 1回のSQLで実行したいのですが、SQLには詳しくないので、 どのように書けばよいか分かりません。 よろしくお願いします。 値引き区分が無ければ、売上げヘッダを見るだけなのですが、 値引きがあるかどうかは、売上げ明細まで見なければいけないので、 SQLの書き方が分からないのと、以下のようなワークテーブルを 作る必要があると思うのですが、どうなのでしょうか。 ●ワーク テーブル   伝票番号   売上日   売上げ金額   値引き区分

  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文で2つのSELCT文の結果を繋げる方法

    SQL文で2つのSELCT文の結果を繋げる方法はありますでしょうか。 Left Join でもと思ったのですが、片側にしかないのも、1レコードとして出力したいです。 テーブルの例と出力の理想は以下です。 また、上記の応用でこれを4テーブル(SELECT文)を繋げて、下記例で言うと、日付と商品コードがキーで、どのテーブルに存在しても、結果を1行で返せるでしょうか。 【テーブル1(SELECT文1)】 F_仕入 伝票日付 商品コード 仕入金額 2014/07/01 101     10,000 2014/07/02 102     15,000 2014/07/05 104 20,000 【テーブル2(SELECT文2)】 F_売上 伝票日付 商品コード 売上金額 2014/07/01 101     15,000 2014/07/02 102     25,000 2014/07/03 103 13,000 上記2つのSELECT結果 伝票日付  商品コード 仕入金額 売上金額 2014/07/01 101 10,000 15,000 2014/07/02 102 15000 25,000 2014/07/03 103 13,000 2014/07/05 104 20,000 よろしくお願いします。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから りんご=3(行) みかん=2(行) メロン=1(行) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 1     りんご 100 2     りんご 100 3     りんご 100 4     みかん 150 5     みかん 150 6     メロン 250

  • SQL文ニ関して

    下記の3つのテーブルから下記フィールドを結合するSQL文を教えてください。 条件 ※SQL*PLUSを使用 ※店舗コードと営業日は共通(フィールドCDは別名) ※掛金額・商品券金額・クレジット金額はそれぞれフィールド数が10個(種類別) ※掛金額・商品券金額・クレジット金額はそれぞれ10個のフィールドを合計し  その合計したフィールドのみを表示させる。別名をつける。 ※必要な店舗コードのみを抽出する。  ※エディタにSPOOLする。 テーブル(1) フィールド名 1 店舗コード 2 営業日 3~12 掛金額 13~22 商品券金額 23~32 クレジット金額 テーブル(2) フィールド名 1 店舗コード 2 営業日 3 現金売上金額 テーブル(3) フィールド名 1 店舗コード 2 営業日 3 現金過不足 宜しくお願いします。

  • SQLについて

    お世話になります。 いろいろ考えたのですが、わかりません。 教えてください。よろしくお願いします。 ●現在のSQLは SELECT 仕入先コード, 支払予定日, SUM(金額) FROM 仕入検収テーブル GROUP BY 仕入先コード,支払予定日 ●テーブルの構成は 仕入検収テーブル  仕入検収番号   (主キー)  仕入先コード  支払予定日  部門番号  金額 ●テーブルデータは 仕入検収番号 仕入先コード 支払予定日 部門番号 金額 1 0001000 2004/06/15 10 3000 2 0001000 2004/06/15 11 7000 3 0002000 2004/06/16 10 20000 4 0001000 2004/06/17 10 1000 上記のようなテーブルの時に 現在は仕入先コードと支払予定日ごとに集約されているのですが、その集約された仕入先コードを用いてその仕入先コードは過去に仕入検収テーブルに登録されていたら備考という項目に「新規」と表示したいのです。 ●実現したい実行結果は 支払予定日 仕入先コード 金額 備考 2004/06/15 00010000 10000 新規 2004/06/16 00020000 20000 新規 2004/06/17 00010000 1000

  • SQLでのレコードの抽出について。

    SQLでのレコードの抽出について。 ExcelのVBAを利用してOracleに接続し、必要なデータのみを抽出したいと考えています。 目的のレコードの抽出じたいには成功しているのですが、 他にも多数の処理を前後で行うのでなるべく高速に処理ができればと考えています。 そこでSQL、VBに詳しい方に作成したコードを見ていただき、もっと高速に処理ができるよう ご教授していただければと思います。 前置きが長くなりましたが、以下に作成したSQLと状況を記載します。 テーブル : t1会議マスタ フィールド: f11部門コード、f12会議NO、f13会議名、f14開催日、その他… テーブル2 : t2会議履歴 フィールド: f21部門コード、f22会議NO、f23出席者CD、その他… というテーブルがあり、ある出席者をもとに その出席者が出席した一番新しい会議の「会議名」「開催日」を取得したいのです。 そこでSQLを作成し、目的のレコードのみを表示するよう作成したのが以下のものです。 SELECT t1会議マスタ.f14開催日 t1会議マスタ.f13会議名 FROM t1会議マスタ INNER JOIN t2会議履歴 ON t1会議マスタ.f11部門コード = t2会議履歴.f21部門コード AND t1会議マスタ.f12会議NO = t2会議履歴.f22会議NO WHERE t1会議マスタ.f14開催日 IN ( SELECT MAX(t1会議マスタ.f14開催日) FROM t1会議マスタ INNER JOIN t2会議履歴 ON t1会議マスタ.f11部門コード = t2会議履歴.f21部門コード AND t1会議マスタ.f12会議NO = t2会議履歴.f22会議NO WHERE t2会議履歴.f23出席者CD = (変数)   AND t2会議履歴.f21部門コード = (???) ) GROUP BY t1会議マスタ.f14開催日, t1会議マスタ.f13会議名 以上です。 もっとシンプルかつ高速に行えればと思います(SQLで完全に絞り込まなくてももっと早い方法があればVBAなどで抽出してもかまいません)。 よろしくお願いいたします。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから みかん=3(行目) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 101   りんご 100 102   りんご 100 103   みかん 150 104   りんご 100 105   みかん 150 106   メロン 250 postgre8.3のためrow_numberが使えません