• 締切済み
  • すぐに回答を!

PL/SQL グループ化について

こんにちは。 現在以下のようなソースが存在するのですが、以下beforeのgroup byに設定している「D」をグループ化の対象外にしなければなりません。 ただし、「D」はSELECT対象であり、かつデータが文字型であり、集計関数の使用対象外(使用した場合に意図した結果とならない)などといった事情があり、単純にgroup by句から外すという対応ではうまくいきません。 誠に恐縮ですが、お知恵をお貸しいただけませんでしょうか? 【before】 ----------------------------------------------------- INSERT INTO 出力テーブル ( A , B , C , D ) SELECT  MIN(テ1.A) AS 別名A,     MAX(テ1.B) AS 別名B,     MAX(テ1.C) AS 別名C,     テ1.D FROM   テーブル1 テ1 WHERE  EXISTS      ( SELECT 0      FROM テーブル2 テ2    JOIN        テーブル3 テ3    ON  テ2.A = テ3.A      WHERE テ1.C = テ2.C      HAVING SUM(DECODE(テ3.G,'Yes',0,1)+DECODE(テ3.H,'Yes',0,1)) = 0 ) GROUP BY テ1.A,     テ1.B,    テ1.C,    テ1.D ;    ←ここを外したいです -----------------------------------------------------

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

  • 回答数1
  • 閲覧数203
  • ありがとう数0

みんなの回答

  • 回答No.1

具体的な入力データと期待する出力結果を書かれてはいかがでしょうか。 データ構造が分からなくては具体的な回答は付きづらいと思いますよ。 また、PL/SQLということからOracleなのだとは思いますが、 RDBMS名とバージョンも記載した方がいいかと思います。

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

関連するQ&A

  • 速度向上。

    速度向上。 Select A,B,C, (Select Count(*) FROM T_A WHERE SOME_ID = A.SOME_ID ) COUNTER , (Select MAX(REGISTER_TIME)FROM T_A WHERE SOME_ID = A.SOME_ID)MAX_REG_TIME FROM T_A as A WHERE ID LIKE '%1%' GROUP BY ID ORDER BY MAX_REG_TIME; テーブルT_AからIDに1が含まれるデータを全て抽出し、かつそれぞれのカウントを抽出し、かつ最新更新日でソートしたいと思います。 データ数が2000程度のテーブルで30秒ほどの時間がかかります。 より速くする良い方法はありますでしょうか?

    • ベストアンサー
    • MySQL
  • サブクエリ:各カテゴリ内で最大の番号を持っている

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

    • ベストアンサー
    • MySQL
  • 金額が確定されなかった品物の価格履歴を削除するDelete文

    各品物の価格変動の履歴と確定値を残す 下のようなテーブル(T_Rireki)があるとします。 | HinBan | Junban  | Nedan  | Kakuteki | ---------------------------------------- |   A   |   1   |   90   |   0    | |   A   |   2   |   80   |   0    | |   A   |   3   |   70   |   1    | |   B   |   1   |   95   |   0    | |   B   |   2   |   90   |   0    | |   B   |   3   |   95   |   0    | |   C   |   1   |   35   |   0    | |   C   |   2   |   30   |   1    | ここから、値段が確定していない( 列 Kakutei の値が 最終的に 1 になっていない) 品番を探し(この場合は、B) それをテーブルから削除したいのです。 目的の行の抽出は、 Select * from T_Rireki as T1 Where (select Max(Kakuteki) from T_rireki where HinBan= T1.HinBan) = 0 もしくは、 Select HinBan , Max(Kakuteki) as M_Kakutei from T_Rireki group by Hinban Having M_Kakutei = 0 などによって、 | HinBan | Nedan | -------------------- |   B  |   95  | |   B  |   90  | |   B  |   95  | の目的の3行を得ることができますが、この3行を削除するためにDelete文に上記のSQLを含もうとするとエラーがでます。 例えば、 Delete from T_Rireki as T1 Where (select Max(Kakuteki) from T_rireki where HinBan= T1.HinBan) = 0 では、うまくいきません。 どのような文にすればいいか、わかる方、どうか教えていただけないでしょうか?

  • フィールドの項目ごとの集計値を取得したい

    3フィールド以上からなる zaikoテーブルに商品情報を登録しています。 このshohinフィールドのshohin ごとにkazu を取りだしたいのですが、   SELECT shohin, COUNT(*) AS kazu FROM zaiko GROUP BY shohin; は +--------+------+ | shohin | kazu | +--------+------+ | A | 1 | | B | 3 | | C | 5 | | D | 7 | +--------+------+ と出ます。   SELECT COUNT(*) AS kazu FROM zaiko GROUP BY shohin; もデータが返りますが、A商品だけを取り出そうと   SELECT COUNT(*) AS kazu FROM zaiko GROUP BY shohin WHERE shohin='A'; とすると、ERROR 1064 (42000): が出てしまいます。 Aだけを取り出すsql 文はどのように書けばよいでしょうか?

    • ベストアンサー
    • MySQL
  • 最後のデータを含むレコード1行 MYSQL

    お世話になります。 最後の日にちを含むレコード全ての抽出方法がどうしてもわかりません。 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 4 AA 3/2 7 5 BB 3/2 4 6 AA 3/3 1 これを、select * from テーブル group by name とすると、 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 select id, name, max(date),amount from テーブル group by name とすると、 id name date amount 1 AA 3/3 5 2 BB 3/2 5 3 CC 3/1 5 望んでいる結果はこうです。最後のdateを含むレコード全てです。 id name date amount 3 CC 3/1 5 5 BB 3/2 4 6 AA 3/3 1 select * from テーブル as a where a.date=(select max(b.date) From テーブル as b where a.id=b.id); このようにしましたが、データの数が膨大なのですごく時間がかかってしまいます。 他、シンプルな方法はないでしょうか。 よろしくお願いします。 MYSQL バージョン5.0.45

  • 複数の副問合わせにて、一つだけデータがない場合の対処法は?

    テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。 そして以下のようなSQLを作りました。 SELECT TBLA.SURYO_1 ,TBLB.SURYO_2 , TBLC.SURYO_3 ,TBLD.SURYO_4 FROM (SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA, (SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB, (SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC, (SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は データがないことにより、SQLを実行すると、対象データがないという結果となります。 当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、 出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ を取得する方法はありますでしょうか? よろしくお願いします。

  • Access、SQLステートメントでの仮テーブルの作り方について

    AccessのSQLステートメントで仮テーブルを使ったSQLを作りたいのですが、構文の書き方がよくわかりません。 わからないなりに以下のようなSQL文を作ってみたのですが、 SELECT TBL.NO FROM [SELECT NO FROM ○○TBL WHERE △△="△△" GROUP BY NO HAVING (Mid(××,2,1)="K") ]. AS TBL; (本当はWHEREのあとにANDがたくさんあります) 実行すると、 「パラメータや別名が正しいこと、無効な文字や区切り記号が含まれていないこと、または名前が長すぎないことを確認してください。」 とメッセージが出ます。 仮テーブルに長いSELECT文をつかうことはできないのでしょうか? ちなみに環境はOS:Win2000+Access2000です。 どなたかアドバイスください。 よろしくお願いします。

  • グループごとの最高得点者一覧を取得するには

    MySQLで、グループごとの最高得点者一覧を取得する方法を教えてください。 例えば、「生徒番号」「学年」「組」「成績」というカラムを持ったテーブルがあるとき、各クラス (「学年」と「組」のペア) から一人ずつ、最高得点を取得した生徒の「生徒番号」と「成績」を取得しようとしています。このとき「生徒番号」は一意ですが、「成績」は一意とは限りません。 また、同じクラスで最高得点者が二人以上いる場合、すべて取得か条件を指定して一人に絞るかを選べたらなおありがたいです。 【だめだった例】 SELECT 生徒番号, 成績 GROUP BY 学年, 組 ORDER BY 成績 DESC ⇒ 「GROUP BY 成績」なので「生徒番号」を SELECT できない SELECT 生徒番号, 成績 GROUP BY 学年, 組 HAVING MAX(成績) ⇒ 同じく SELECT 生徒番号, 成績 WHERE 成績 IN ( SELECT MAX(成績) FROM テーブル GROUP BY 学年, 組 ) ⇒ 「成績」は一意ではないので、余分な行 (他のクラスで成績が同じ者) が取得される

    • ベストアンサー
    • MySQL
  • Access97のクエリーでのDISTINCTROW について

    Access97のクエリーでのDISTINCTROWの解読の仕方がわからず困っています。 SELECT DISTINCTROW テーブル1.番号, テーブル1.D名, テーブル1.E名, FROM テーブル1 WHERE (((テーブル1.番号) In (SELECT [番号] FROM [テーブル1] As Tmp GROUP BY [番号] HAVING Count(*)>1 ))) ORDER BY テーブル1.番号; このSQL文はどういう条件のデータを選択する意味なのでしょうか。 教えてください。

  • Oracle 10.2.0 でMAX集計がおかしい!?

    VB6 で oo4o を使って Oracle DB開発をしています。 Oralce 8.1.6 から Oracle10.2.0 にサーバを切り替えました。 bというテーブルがあって、 a c d ---- ------ ----- 10 2 1 20 3 1 30 4 1 40 5 1 50 6 2 というデータがあったとします。 Select MAX(a) as a from b WHERE d=1 のようなSQLをVBから発行したときに SQL*PLUSでは、 a ---- 40 という結果が返ってくるのですが、VBでは、 a --- 10 20 30 40 のように複数行のレコードセットが帰ってきます。そのため、最大行を取得できません。Oracle8 のときは、SQL*PLUSと同じ結果が返ってきていました。ちなみに Select MAX(a) as a from b WHERE d=1 GROUP BY d ~~~~~~~~~~ と、GROUP BYを付けると、ただしい(SQL_PLUSと同じ値)値が取得できます。 Oracle10.2.0の問題か、oo4oの問題かと考えています。 ちなみにoo4oのオブジェクトは、 CreateObject("OracleInProcServer.XOraSession") で作成していて、クライアントのバージョンは 9.2.0.4.4です。 長文で失礼しますが、どなたかSQLを変更せずに解決する方法をご存じないでしょうか?