各店舗の最大売上項目を取得したい方法

このQ&Aのポイント
  • Oracle9i+VB6.0で開発をしている場合、各店舗毎の最大売上の項目CDを取得する方法を教えてください。
  • T_詳細データテーブルの中には、店舗CD、項目CD、売上という項目があります。
  • SELECT文で店舗CD毎の最大売上の項目CDを取得する方法を教えてください。
回答を見る
  • ベストアンサー

各店舗毎の最大売上の項目を取得したい

Oracle9i+VB6.0で開発をしています。 各店舗毎のデータを以下のように持っています。 T_詳細データ ============== 店舗CD|項目CD|売上 ----------- 001|001|100 001|002|800 001|003|200 002|001|710 002|002|110 002|003|210 002|004|100 003|001|120 003|003|110 003|004|620 店舗CD毎の最大売上の項目CDを取得したいのです。 店舗CD|項目CD|売上 ----------- 001|002|800 002|001|710 003|004|620 SELECT  店舗CD ,  MAX(売上) FROM  T_詳細データ GROUP BY  店舗CD としてしまうと、どうしても項目CDが取得できません。 (当たり前ですが・・・) MAX() OVER(...)というのを使うのかな、と思ったのですが うまくできませんでした。 アドバイスよろしくお願いいたします。

  • Oracle
  • 回答数1
  • ありがとう数1

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

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

サブクエリを使えばできると思います。 ただ、売り上げが同じ場合には、複数表示されると思います。 select 店舗CD,項目CD,売上 from T_詳細データ where (店舗CD,売上) in (select 店舗CD,max(売上) from T_詳細データ group by 店舗CD) これで上手くいくと思いますが、いかがでしょうか?

bluepenguin
質問者

お礼

すばらしいっ!!!! こんなことができるとは!!! 試してみましたが、ばっちり望み通りの結果を得ることができました。 これって使いこなせると、すごく色々応用が利きそうですね。 自分でも、もうちょっと調べて使えるようにしてみます。 アドバイスありがとうございました。

関連するQ&A

  • Oracle:グループごとに最大日付の行を1件取得

    Oracle11gで、以下のようなテーブルから、 「IDごとに、DTが最大のレコードのBUMONを1件ずつ取得」 したいです。 <テーブルTB> ID DT BUMON ------------- 1 9/1 A 1 9/2 A 1 9/3 B ★Bを取得したい 2 9/4 C 2 9/5 C ★Cを取得したい 3 9/1 D 3 9/3 E 3 9/3 E ★Eを取得したい <取得したいデータ> BUMON ------- B C E <考えたSQL> select distinct A.BUMON from (select ID, DT, max(DT) over(partition by ID) as MAXDT, BUMON from TB) A, (select ID, DT, max(DT) over(partition by ID) as MAXDT, BUMON from TB) B where A.ID = B.ID and A.DT = B.MAXDT ; 上記のような方法を考えましたが、取得できますでしょうか? 現在、SQL実行環境がない場所にいるのですが、急ぎで確認したく、 どなたかお知恵を拝借できませんでしょうか?? また、可能であれば、★のレコード全体を取得するSQLもご教授いただきたく存じます。 <★のレコード全体を取得した結果> ID DT BUMON ------------- 1 9/3 B 2 9/5 C 3 9/3 E

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • SELECTで1件のみ取得するには?

    こんにちわ。 いまORACLE9iを使用している者です。 ACCESSでは SELECT TOP 1 項目名 FROM テーブル名 ORDER BY 項目名; で並べ替えたデータ群のうち,先頭の1件だけを 取ることができますが, ORACLEでそのような機能(SQL)はあるでしょうか? 教えてください。 よろしくお願いします。

  • Group By を使用して任意のカラムの最大値のデータを取得する。

    Group By を使用して任意のカラムの最大値のデータを取得する。 次のようなテーブルデータがあるとします。   ID    店舗CD    適用日付   A001   101      20100701   A002   101      20100801   A003   101      20100901   B001   102      20100701   B002   102      20100801   B003   102      20100901 抽出イメージですが、このテーブルデータの店舗コードをGroupByして、MAX(適用日付) としたときにIDが取得できなくなります。 なのでGroupByしたときの日付最大値のデータのIDを取得したいのですがいい方法が浮かびません。  同じテーブルデータでGroupBy(店舗コード)、MAX(適用日付)としたサブクエリを(店舗CD=店舗CD)、(適用日付=適用日付)とInnerJoinする方法も考えましたが、万が一、適用日付と店舗CDが同一のものがあった場合、店舗CDが重複してしまいます。  各店舗CDの最大適用日付のID取得したいのです。 なのでイメージはGroupby(店舗CD)とMAX(適用日付)とした時にMAX(適用日付)のIDを取得し、 なおかつ欲をいえば、MAX(適用日付)のIDが複数存在する場合は、1店舗CDにつき一つの適用日付を取得したいです。(この際、IDはなんでもいいです。) 簡単そうなことですごく悩んでいます。 どなたか助けてください。 よろしくお願いします。

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • 最近の20件を取得するSQL

     現在PostgreSQL上にあるDBをOracleに移行しようとしていますが、Oracleに詳しくないためご教示いただきたく存じます。  2000万行ほどの売り上げテーブルがあります。  そこである商品やジャンルで絞り込みをおこない(または全く絞り込みをせず)最近20件を検索したいと思っています。(正確に言うと、次ページ、前ページなどでその前後を取得する機能も必要です。)  で、この最近の20件、というところで躓いています。  いろいろと検索してみると select * from ( select 検索項目... from sold where 絞り込み条件 order by sold_date desc ) where rownum<20; なんていう例が載っていたりするのですが、これだと絞り込みがない場合に内側のselect文で2000万件なめてしまうので論外です。(試しにやってみたら30秒くらいかかりました)  別段レアなケースでもなく、こういう要件はとても一般的だと思うのですが、Oracleではどのように実装するのが一般的なのでしょうか。  よろしくお願いいたします。

  • ポスグレで指定した中で最大のレコードを1件取得する

    ポスグレで指定した中で最大のレコードを1件取得する方法を教えてください。 下記の項目を持つテーブルがあるとします。 ・部署 ・氏名 ・日付 ・連番 ・内容 KEY(部署,氏名,日付,連番) 部署と氏名を指定した中で直近のレコードを1件だけ取得したいです。 例えば select * from テーブル where 部署 = 値 and 氏名 = 値 order by 日付 desc ,連番 desc で頭の1件を抜ければよいのですが、 limit 1を指定しても、どうやらorder byより先にlimitがかかっているようで、並び替えた後の最初の1件をとれません。 また、 ソート項目が1つだけなら select * from テーブル where 部署 = 値 and 氏名 = 値 and 日付 = (select max(日付) from テーブル t1 where t1.部署 = 値 and t1.氏名 = 値) という事もできますが、 日付が最大の中での連番が最大というのはさらに一手間必要です。 何か良い方法はありませんか? 全件持ってきた後にアプリ側で最初の1件だけ使うのではなく、postgres内で1件にしてアプリ側に渡したいです。

  • 列番号による項目の取得について

    SQLの構文についての質問です。 あるテーブルからデータを取得する場合、 「SELECT 項目名1,項目名2・・ FROM テーブル名 WHERE 条件」 というSQL文となりますが、 項目名1,項目名2の部分を列番号を指定することによって 値を取得することは可能でしょうか?

  • サブクエリ:各カテゴリ内で最大の番号を持っている

    各カテゴリ内で最大の番号を持っているものの詳細を表示したいと思っていますが、以下のクエリではエラーがでてしまいます。 SELECT * FROM favorite WHERE no = (SELECT max(no) AS max_no FROM favorite GROUP BY category) 何が悪いのでしょうか?ぜひアドバイスをお願いします。

    • ベストアンサー
    • MySQL
  • 複数テーブルからデータ取得について

    初めて投稿します。よろしくお願いします。 SQLを使うのが初めてなので勉強をしながら作業を行なっています。そのため説明不足などありましたらご指摘願います。 [環境]  データベース:SQLServer2003 下記SQL文より、該当データの抽出は出来たのですが、 この3つのSQL文を一つのSQL文にて該当データを取得したいのですが、なかなか解決出来ないので宜しくお願いします。 SELECT isnull(会員CD,' '), isnull(郵便番号,' '), isnull(住所,' '), isnull(番地,' '), isnull(方書,' '), FROM KAIINMST AS A WHERE 更新カウンター = (SELECT MAX(更新カウンター) FROM KAIINMST WHERE A.会員CD = 会員CD) GROUP BY 会員CD,郵便番号,住所,番地,方書 ORDER BY 会員CD SELECT isnull(会員CD,' '), isnull(送付郵便番号,' '), isnull(送付住所,' '), isnull(送付番地,' '), isnull(送付方書,' '), FROM KAIINSOF AS A WHERE 更新カウンター = (SELECT MAX(更新カウンター) FROM KAIINSOF WHERE A.会員CD = 会員CD) AND 業務CD = "20" GROUP BY 会員CD,送付郵便番号,送付住所,送付番地,送付方書 ORDER BY 会員CD SELECT isnull(会員CD,' '), isnull(代理会員CD,' '), isnull(会員区分,' ') FROM DAIRI AS A WHERE 更新カウンター = (SELECT MAX(更新カウンター) FROM DAIRI WHERE A.会員CD = 会員CD) AND 業務CD = "20" GROUP BY 会員CD,代理会員CD,会員区分 ORDER BY 会員CD KAIINMSTテーブルをLEFT JOIN で他のテーブルデータを結合して欲しいです。 KAIINMASTの会員CDに対して他テーブルの該当データが存在しない場合は、NULLを設定して下さい。 以上です。宜しくお願いします。