簡體   English   中英

Oracle 11g分組

[英]Oracle 11g group by

我是Oracle新手,對MySQL有所了解。 我想做這個工作:

SELECT A1, A2, A3, SUM(A4) SA4
FROM (
SELECT A1
    , A2
    , A3
    , A4
FROM T1
GROUP BY A1, A2, A3, A4, A5, A6, A7, A9, A10, A11, A12 ...
) a
GROUP BY A1, A2, A3

我很確定它可以在MySQL中使用,但是在Oracle中卻出現以下錯誤:

ORA-00979“不是GROUP BY表達式”

它讓我瘋狂。 內部查詢太大了,無法在此處顯示,但是肯定有重復項,而這就是我想通過外部查詢消除的內容。 您能幫我解決我做錯了什么嗎? 非常感謝你!

您的確需要內部查詢的分組依據,因此

    SELECT a1,
         a2,
         a3,
         SUM (a4) sa4
    FROM (SELECT DISTINCT NULL a1,
                          NULL a2,
                          NULL a3,
                          NULL a4
            FROM t1) a
GROUP BY a1, a2, a3

在內部查詢中:

SELECT DISTINCT A1
    , A2
    , A3
    , A4
FROM T1
GROUP BY A1, A2, A3

您擁有的A4既不是GROUP BY表達式的一部分,也不是聚合的一部分。 那就是給你的錯誤。

將查詢更改為:

SELECT A1, A2, A3, SUM(A4) SA4
FROM (
  SELECT DISTINCT A1, A2, A3, A4
  FROM   T1
) a
GROUP BY A1, A2, A3

但是,您可以將其簡化為(擺脫內部查詢):

SELECT A1, A2, A3, SUM(DISTINCT A4) SA4
FROM   T1
GROUP BY A1, A2, A3

嘗試這個:

SELECT A1, A2, A3, SUM(A4) SA4
FROM (
SELECT 
 DISTINCT 
      A1
    , A2
    , A3
    , A4
FROM T1 
) a
GROUP BY A1, A2, A3

您不需要一起使用DISTINCTGROUP by

主要問題是:您真正想要實現什么?

在內部查詢中,您按A1,A2,A3分組,因此每個A1 / A2 / A3組合都會得到一行。 所有這些列都在選擇列表中。 因此每一行都彼此不同,因為它們都具有不同的A1 / A2 / A3組合。 使用DISTINCT可以從結果中刪除重復項,但是在您的情況下,如上所述不能存在重復項,因此DISTINCT在這里是完全多余的。

然后選擇A4,但是在按A1,A2,A3分組時,通常必須決定要使用哪個A4。

  • 如果A4依賴於A1,A2,A3或它們的組合(例如,員工編號上的員工姓名,即,由其編號標識的員工只有一個姓名),我們正在討論一個A4,查詢將根據SQL標准有效。 MySQL讓您這樣編寫查詢,但是不幸的是Oracle仍然堅持要為組指定哪個A4。 好吧,如果只有一個,則可以使用MIN(A4)或MAX(A4)在這里滿足Oracle。

  • 但是,如果A4不依賴於A1,A2,A3或其組合(例如,雇員編號不依賴於部門,因為每個部門存在多個雇員),則查詢無效。 但是,MySQL曾經允許該查詢,並且會返回任意選擇的A4(就像任意選擇部門的一名雇員一樣)。 這常常導致初學者編寫不正確的查詢。

最后,再次對A1,A2,A3進行分組,這是完全多余的,因為數據已經按A1,A2,A3進行分組。 您將每個組的一個A4值相加,這當然是該值本身。

可能您只是希望每個A1,A2,A3的A4總和為

SELECT A1, A2, A3, SUM(A4) AS SA4
FROM T1
GROUP BY A1, A2, A3;

但是也許您完全想要其他東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM