SQL SERVER DUPLICATE VALUES

时间:2015-09-27 21:25:02

标签: sql-server

我有2个表,一个用于课程名称(名为Courses),另一个用于教授该课程的大学(名为Unicourses)。

我想从UniCourses表中选择coursenameCourses列中的所有列。

一切顺利,但我在查询结果中重复了一些值,并希望所有coursename列都是唯一的。

我尝试使用DISTINCT,但我无法让它发挥作用。

这是我正在使用的查询:

SELECT 
    UniCourses.courseid, UniCourses.uniname, 
    UniCourses.rating, UniCourses.ratingppl, 
    UniCourses.approved,
    Courses.courseid, Courses.coursename  
FROM 
    UniCourses 
INNER JOIN 
    Courses ON UniCourses.courseid = Courses.courseid  
WHERE 
    UniCourses.approved = 1  
ORDER BY 
    UniCourses.rating / CASE UniCourses.ratingppl WHEN 0 THEN 1 ELSE UniCourses.ratingppl END DESC;

这就是我得到的

|courseid|uniname|rating|ratingppl|approved|coursename|
_______________________________________________________
|    4   |howard | 20   |    5    |    1   |  algebra |
|    4   |hampton| 10   |    2    |    1   |  algebra |

这就是我想要的

|courseid|uniname|rating|ratingppl|approved|coursename|
_______________________________________________________
|    4   |hampton| 10   |    2    |    1   |  algebra |

正如您所看到的,这些课程与2所大学教授的课程相同, 我希望只出现1,具有最高等级,由...计算 (评级/ ratingppl);

Courses表格列:

courseid, coursename

Unicourses表格列:

courseid, uniname, rating, ratingppl, approved

3 个答案:

答案 0 :(得分:2)

WITH X AS 
 (
    SELECT UniCourses.courseid,UniCourses.uniname,UniCourses.rating
          ,UniCourses.ratingppl,UniCourses.approved,Courses.courseid
          ,Courses.coursename  
          ,ROW_NUMBER() OVER (PARTITION BY Courses.coursename
                              ORDER BY ISNULL((rating / NULLIF(ratingppl, 0)),0)
                               DESC) rnRating
    FROM UniCourses 
    INNER JOIN Courses 
    ON UniCourses.courseid = Courses.courseid  
    WHERE UniCourses.approved=1
 )
SELECT courseid,uniname,rating ,ratingppl
      ,approved,courseid ,coursename
FROM x
WHERE rnRating = 1

答案 1 :(得分:0)

当你在霍华德和汉普顿都有相同的路线时,你正试图加入the course。

将霍华德路线更改为不同的值,它将返回您的唯一记录。

答案 2 :(得分:0)

如果没有Id coulmns

SELECT
    UniCourses.courseid,
    UniCourses.uniname,
    UniCourses.rating,
    UniCourses.ratingppl,
    UniCourses.approved,
    Courses.courseid,
    Courses.coursename  
FROM UniCourses 
INNER JOIN Courses ON 
        Courses.courseid = UniCourses.courseid
INNER JOIN (
    SELECT 
        UniCourses.courseid, 
        MAX(UniCourses.rating / CASE UniCourses.ratingppl WHEN 0 THEN 1 ELSE UniCourses.ratingppl END) as MaxValue
    FROM UniCourses
    GROUP BY UniCourses.courseid
    ) AS CoursesMax ON 
            CoursesMax.courseid = UniCourses.courseid 
            AND (UniCourses.rating / CASE UniCourses.ratingppl WHEN 0 THEN 1 ELSE UniCourses.ratingppl END)= MaxValue