2012-11-03 53 views
0

我想列舉教授「java」的姓名教授,他教的次數以及他教授的最新年份和學期。MAX函數和GROUP BY函數不能一起工作

我試過這個查詢,但它給了兩個同名的行。

SELECT i.I_FNAME, COUNT(f.I_ID) as myCount, f.CO_TERMNUMBER, f.CO_YEAR 
FROM 
    INSTRUCTOR i 
JOIN TEACHINGQUALIFICATION t 
    ON i.I_ID = t.I_ID 
JOIN COURSE c 
    ON c.C_ID = t.C_ID 
JOIN COURSEOFFERING f 
    ON i.I_ID = f.I_ID 
WHERE c.C_TITLE = 'java' 
    GROUP BY t.I_ID, i.I_FNAME, f.CO_TERMNUMBER, f.CO_YEAR 
    ORDER BY f.CO_YEAR desc 

輸出:

1 Gaurav 1 4 2006 
2 Gaurav 1 1 2000 

預期輸出:

1 Gaurav 2 4 2006 

代碼,錯誤:

我還試圖噸他的代碼與條件 「AND f.CO_YEAR = MAX(f.CO_YEAR)」,但它顯示這個錯誤 「功能組這裏不允許」

SELECT t.I_ID, i.I_FNAME, COUNT(f.I_ID) as Cnt, f.CO_TERMNUMBER, f.CO_YEAR 
FROM 
    INSTRUCTOR i 
JOIN TEACHINGQUALIFICATION t 
    ON i.I_ID = t.I_ID 
JOIN COURSE c 
    ON c.C_ID = t.C_ID 
JOIN COURSEOFFERING f 
    ON i.I_ID = f.I_ID 
WHERE c.C_TITLE = 'itec801' AND f.CO_YEAR= MAX (f.CO_YEAR) 
    GROUP BY t.I_ID, i.I_FNAME, f.CO_TERMNUMBER, f.CO_YEAR 
    ORDER BY f.CO_YEAR desc 

修訂


此代碼顯示最近一年的輸出,但問題是當它提取最新的行時,計數器停在那裏並顯示1個值。但我想統計所有的行,然後只顯示最新的一年。

SELECT t.I_ID, i.I_FNAME, COUNT(f.I_ID) as Cnt, f.CO_TERMNUMBER, f.CO_YEAR 
    FROM 
     INSTRUCTOR i 
    JOIN TEACHINGQUALIFICATION t 
     ON i.I_ID = t.I_ID 
    JOIN COURSE c 
     ON c.C_ID = t.C_ID 
    JOIN COURSEOFFERING f 
     ON i.I_ID = f.I_ID 
JOIN 
    (
    SELECT I_ID, MAX(CO_YEAR) LatestYear 
    FROM COURSEOFFERING GROUP BY I_ID 
    ) 
    f2 ON f.I_ID = f2.I_ID AND f.CO_YEAR = f2.LatestYear 

    WHERE c.C_TITLE = 'itec801' 
     GROUP BY t.I_ID, i.I_FNAME, f.CO_TERMNUMBER, f.CO_YEAR 
    having f.CO_YEAR= MAX (f.CO_YEAR) 
     ORDER BY f.CO_YEAR desc 

新的輸出:

1 Gaurav 1 4 2006 

預期輸出:

1 Gaurav 2 4 2006 

回答

1

這個查詢,我還沒有嘗試過什麼,但:

SELECT i.I_FNAME, COUNT(f.I_ID) as Cnt, MAX(f.CO_TERMNUMBER), MAX(f.CO_YEAR) 
FROM 
    INSTRUCTOR i 
JOIN TEACHINGQUALIFICATION t 
    ON i.I_ID = t.I_ID 
JOIN COURSE c 
    ON c.C_ID = t.C_ID 
JOIN COURSEOFFERING f 
    ON i.I_ID = f.I_ID 
WHERE c.C_TITLE = 'itec801' 
    GROUP BY i.I_FNAME 
+0

它爲我工作了一段時間,但它從最近的日期只顯示一位教授的姓名。它必須向所有明確授課的教授展示他們各自教授同一課程'itec801'的最新日期。 – nirmalgyanwali

+0

請檢查您的加入條件。 – TechDo

0
If you have aggeragate function then use having statement like and must below order : 
    select * from table 
    where cond... 
    group by ... 
    having cond ... 
    order by.. 
    ======================= 
    Exapmle: 

     SELECT t.I_ID, i.I_FNAME, COUNT(f.I_ID) as Cnt, f.CO_TERMNUMBER, f.CO_YEAR 
     FROM 
     INSTRUCTOR i 
     left outer JOIN TEACHINGQUALIFICATION t ON i.I_ID = t.I_ID 
     left outer JOIN COURSE c ON c.C_ID = t.C_ID 
     left outer JOIN COURSEOFFERING f ON i.I_ID = f.I_ID 
     WHERE c.C_TITLE = 'itec801' 
     GROUP BY t.I_ID, i.I_FNAME, f.CO_TERMNUMBER, f.CO_YEAR 
     having f.CO_YEAR= MAX (f.CO_YEAR) 
     ORDER BY f.CO_YEAR desc 
+0

@vikram ..謝謝你的幫助。我已經更新了這個問題。請檢查一次,你可以幫助我。 – nirmalgyanwali

0

您需要使用Having clause

試試這個(我沒有測試它)

SELECT t.I_ID, i.I_FNAME, COUNT(f.I_ID) as Cnt, f.CO_TERMNUMBER, f.CO_YEAR 
FROM 
    INSTRUCTOR i 
JOIN TEACHINGQUALIFICATION t 
    ON i.I_ID = t.I_ID 
JOIN COURSE c 
    ON c.C_ID = t.C_ID 
JOIN COURSEOFFERING f 
    ON i.I_ID = f.I_ID 
WHERE c.C_TITLE = 'itec801' 
    GROUP BY t.I_ID, i.I_FNAME, f.CO_TERMNUMBER, f.CO_YEAR 
    HAVING f.CO_YEAR= MAX (f.CO_YEAR) 
    ORDER BY f.CO_YEAR desc 
+0

謝謝你的幫助。但它仍然顯示相同的輸出。 – nirmalgyanwali

+0

@kernel ..謝謝你的幫助。我已經更新了這個問題。請檢查一次,你可以幫助我。 – nirmalgyanwali