2012-11-03 54 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