2014-04-07 248 views
0

我試圖選擇max(行數)。 這裏是我的2個SELECTSQL嵌套聚合函數MAX(COUNT(*))

SELECT MAX(COUNT_OF_ENROLEES_BY_SPEC) FROM 
(SELECT D.SPECCODE, COUNT(D.ENROLEECODE) AS COUNT_OF_ENROLEES_BY_SPEC 
FROM DECLARER D 
GROUP BY D.SPECCODE 
); 

SELECT S.NAME, MAX(D.ENROLEECODE) 
    FROM SPECIALIZATION S 
    CROSS JOIN DECLARER D WHERE S.SPECCODE = D.SPECCODE 
    GROUP BY S.NAME 
    HAVING MAX(D.ENROLEECODE) = 
    (SELECT MAX(COUNT_OF_ENROLEES_BY_SPEC) FROM 
     (SELECT D.SPECCODE, COUNT(D.ENROLEECODE) AS COUNT_OF_ENROLEES_BY_SPEC 
     FROM DECLARER D 
     GROUP BY D.SPECCODE 
    ) 
); 

第一個是工作正常的變種,但我想在我的第二個變體使用「具有」重寫它像,並添加有一個多列。但是現在第二個變體不會在結果中輸出任何數據,只是空列。 我該如何解決它?謝謝)

+0

你想要最大代碼等於最大*數*代碼?這看起來不合理。 –

+0

我想統計專業代碼分組的行數(聲明),而不是採用最流行的專業化。對不起,我的英文;(現在清楚了嗎?) – skymk

回答

0

基礎上的意見與建議給予說明這個查詢,所以它可能是錯的!

select     -- 4. Join selected codes with specializations 
    S.Name, 
    selected_codes.spec_code, 
    selected_codes.count_of_enrolees_by_spec 
from 
    specialization S, 
    ( 
    select    -- 3. Filter records with maximum popularity only 
     spec_code, 
     count_of_enrolees_by_spec 
    from (
     select    -- 2. Count maximum popularity in separate column 
     spec_code, 
     count_of_enrolees_by_spec, 
     max(count_of_enrolees_by_spec) over (partition by null) max_count 
     from (
     SELECT   -- 1. Get list of declarations and count popularity 
      D.SPECCODE   AS SPEC_CODE, 
      COUNT(D.ENROLEECODE) AS COUNT_OF_ENROLEES_BY_SPEC 
     FROM DECLARER D 
     GROUP BY D.SPECCODE 
    ) 
    ) 
    where count_of_enrolees_by_spec = max_count 
) 
    selected_codes 
where 
    S.SPECCODE = selected_codes.spec_code 

此外,還要查詢沒有經過測試和一些語法錯誤是可能的。

+0

謝謝,它可以解決你的錯誤!請問,請解釋一下這部分 - 「over(partition by null)」? – skymk

+0

使用[analytic functions](http ://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm#SQLRF06174)你需要在['PARTITION BY']中指定分區(http://docs.oracle.com/cd/ E11882_01/server.112/e26088/functions004.htm#SQLRF51197)子句用於選擇GROUP行中的行組如果只需要一個包含所有行數據集的組,則指定一些常量表達式很有用,例如'1 '''''''''''''''Null'也有效。就個人而言,我更喜歡'null'來獲得更多的代碼可讀性,因爲它沒有提出像「爲什麼選擇1而不是0」這樣的問題。 – ThinkJet

+0

謝謝!非常好的解釋。我們可以在這個選擇的GROUP BY表達式中使用而不是OVER(PARTITION BY NULL)來獲得相同的結果嗎?我讀了這些表達式,但是我沒有如果我使用max(count_of_enrolees_by_spec)然後嘗試GROUP BY spec_code和count_of_enrolees_by_spec,理解爲什麼出現錯誤。 – skymk