2013-12-19 326 views
6

我想在oracle中將GROUP BY函數與MAX結合起來。我閱讀了大量文檔的周圍,試圖找出如何格式化我的要求由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'; 

任何提示?

編輯它似乎與我的領域的數據類型有一些棘手的部分。

  • T_IDVARCHAR2
  • A.VVARCHAR2
  • B.TCLOB
+3

不要把蘋果(數字)與橘子(字符串)比較。 ''''是一個字符串,它是***不是一個數字 - ('1.00'或'1')是一個數字。 –

+0

@a_horse_with_no_name你說得對,現在好多了:)但是我仍然得到了932錯誤,看起來像oracle預期的一些數據類型,並得到一個CLOB insteab - 這是類型的BT – Xavier

+0

你不能做一個'在'CLOB'專欄 - 你爲什麼需要這些?如果你需要一個max(),那麼'CLOB'聽起來不像正確的數據類型。如果你將數字存儲在'LOG.V'中,那你爲什麼不把它定義爲'數字'?將數字存儲在'varchar'列中是一個非常糟糕的設計。 –

回答

1

一些修正之後,它似乎主要問題是在group by

,你必須使用同一個表中的SELECT並在GROUP BY

我也只拿CLOB的一個子得到有用。工作要求是:

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

仍然得到932錯誤,正如我上面所說的A.V是VARCHAR2 – 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) 

然後你當然還得在你的輸出中使用TO_CHAR clob。

請注意,這個問題有兩個級別......第一個是你有一個clob列,不需要是clob;它只包含一些適合VARCHAR2的小字符串。我的解決方法適用於此。

第二個層次實際上是想要按包含大字符串的列進行分組。在這種情況下,TO_CHAR可能無濟於事。

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是空的,你也需要把它包裝在NVL()中,否則你只會得到NULL;無論您是選擇升序還是降序,NULL值總是先排序(至少在Oracle SQL中)。