2013-12-19 84 views
6

私はGROUP BY関数をMAXのoracleに組み合わせようとしています。私の周りのドキュメントをたくさん読んで、常にOracleが私の要求をフォーマットする方法を把握することを試みる返しますOracleでCLOB列のGROUP BYを使用する方法は?

ORA-00979:こちらを

「を表現することによってではないグループ」私の要求です。

SELECT A.T_ID, B.T, MAX(A.V) 
FROM bdd.LOG A, bdd.T_B B 
WHERE B.T_ID = A.T_ID 
GROUP BY A.T_ID 
HAVING MAX(A.V) < '1.00'; 

ヒント

EDIT私のフィールドのデータ型にはややこしい部分があります。

  • T_IDVARCHAR2
  • A.VVARCHAR2
  • B.TであるCLOB
+3

リンゴ(数字)をオレンジ(文字列)と比較しないでください。 '' 1.00''は文字列です*** ***は数字ではありません - ( '1.00'または' 1')は数字です。 –

+0

@a_horse_with_no_nameあなたは正しいです、今は良いです:)しかし、私はまだ932のエラーがあります。見た目は、いくつかのデータ型が期待されていて、CLOB insteabを取得しています--BTのタイプです – Xavier

+0

'group by' 'CLOB'列に - なぜあなたはそれを必要としますか? max()が必要な場合、 'CLOB'は正しいデータ型のようには聞こえません。そして、もしあなたが 'LOG.V'に数字を格納すれば、なぜそれを' number'として定義しないのですか? 'varchar'カラムに数値を格納するのは本当に悪い設計です。 –

答えて

1

できます。作業要求は次のとおりです。

SELECT TABLE_A.ID, 
     TABLE_A.VA, 
     B.TRACE 
FROM 
(SELECT A.T_ID ID, 
      MAX(A.V) VA 
    FROM BDD.LOG A 
    GROUP BY A.T_ID HAVING MAX(A.V) <= '1.00') TABLE_A, 
                   BDD.T B 
WHERE TABLE_A.ID = B.T_id; 
1

はこれを試してみてくださいされています

SELECT A.T_ID, B.T, MAX(A.V) 
FROM bdd.LOG A, bdd.T_B B 
WHERE B.T_ID = A.T_ID 
GROUP BY A.T_ID, B.T 
HAVING MAX(A.V) < 1; 
+0

別のエラー、ORA-00932の一貫性のないデータ型が戻されます。上記のコメントを参照していますか? – Xavier

+0

@x_vi_rはいそうすべきです。私は答えを更新しました –

+0

A.VがVARCHAR2であると言ったように、まだ932エラーが発生します – Xavier

0
WITH foo as (
    SELECT A.T_ID, B.T, MAX(A.V) maxav 
    FROM bdd.LOG A, bdd.T_B B 
    WHERE B.T_ID = A.T_ID 
    GROUP BY A.T_ID, B.T 
) 
SELECT * FROM foo WHERE maxav < 1 
+0

Thx助けて!前と同じエラー:ORA-00932予期しないデータ型が予期されます: - CLOBを取得しました。 (CLoBはB.Tのデータ型です) – Xavier

+0

明らかに、CLOB列によるグループ化は悪い考えです。 –

+0

DBMS_LOBを使用する必要がありますか? – Xavier

11

私は、誰かがあなたが望むものとはまったくまったく違うことをするように設計されたテーブルのクエリを書くという現象に非常に精通しています。私はこの同じ問題を抱えていたとき、私は使ってきました。

GROUP BY TO_CHAR(theclob) 

、その後、もちろんあなたも、あなたの出力でCLOBをTO_CHARする必要があります。

この問題には2つのレベルがあることに注意してください。まずは、あなたがclobである必要のないclob列を持っていることです。 VARCHAR2に収まる小さな文字列しか保持していません。私の回避策はこれに適用されます。

2番目のレベルは、実際にはです。大きな文字列を含む列でグループ化するには、が必要です。その場合、おそらくTO_CHARは役に立たないでしょう。大きな問題は、あなたがSELECTで同じテーブルを使用する必要があるとGROUP BY

に私も取得するCLOBの唯一の部分文字列を取るgroup by

にあったと思われるいくつかの修正後

0

この応答が少し遅れているが、グループ化値と最大値の基準列以外の値を必要とする人のために、あなたが望む結果を得るために、パーティション上ROW_NUMBER()を使用することができます。

SELECT T_ID, T, V 
FROM 
(
SELECT A.T_ID, B.T, A.V, ROW_NUMBER() OVER (PARTITION BY A.T_ID ORDER BY to_number(A.V) DESC) rownumber 
FROM bdd.LOG A, bdd.T_B B 
WHERE B.T_ID = A.T_ID 
) 
WHERE rownumber = 1 

最大値を取得するには、ORDER BYのDESC修飾子を忘れないでください。それがなければ、最小値が得られます。もし。Vがnullでも可能ですが、NVL()でラップする必要があります。そうしないとNULLを取得できません。昇順または降順を選択した場合でも、NULL値は常に(少なくともOracle SQLでは)最初にソートされます。

関連する問題