TOP 10的SQL查询取决于两列

时间:2013-03-08 19:11:16

标签: php html sql sql-server

我是SQL(初学者程序员)的新手,所以如果这看起来像一个简单的问题我很抱歉。我正在尝试在我的网站上创建一个表格,其中显示了最低的10个等级以及有关该学生的一些信息。从这方面来说我很舒服,但我在编写SQL查询时遇到了麻烦。我正在使用SQL Server 2008。

我的数据库中有一个包含10列和500行的表。其中两列包含等级(等级1和等级2)。我的目标是在我的网站表中显示TOP 10最低GRADE1,但如果GRADE1为NULL,我希望它考虑GRADE2并显示它。因此,在上下文中,如果名为Billy的学生没有GRADE1(其NULL)但他的GRADE2是最低的(GRADE1的AND GRADE2的组合),他应该在列表中排在第一位。

我非常感谢帮助创建一个能够完成此任务的查询,我一直在研究解决方案,但它只让我更加困惑。

5 个答案:

答案 0 :(得分:1)

在SQL Server中,您要使用isNull()

SELECT TOP 10 isNull(grade1,grade2) AS `Grade`
FROM mytable
ORDER BY Grade DESC

答案 1 :(得分:1)

您可以按顺序使用案例

select top 10 * 
from students 
order by case when grade1 is null then grade2 else grade1 end desc

编辑

继BillyCode发表评论后,我只建议在表格中包含3次或更多次的学生,我建议

select top 10 s.*  
from students s
inner join (select StudentId, Count(*) as total from students) c on s.StudentId = c.StudentId  
where c.total >= 3
order by case when grade1 is null then grade2 else grade1 end desc

但我不确定你是否可以加入子查询。

答案 2 :(得分:0)

COALESCE功能可以满足您的需求。 COALESCE(GRADE1, GRADE2)如果不为空,则显示GRADE1;如果GRADE2为空,则显示GRADE1

因此,您可以执行ORDER BY GRADE1

而不是ORDER BY COALESCE(GRADE1, GRADE2)

See here了解有关COALESCE

的更多详情

答案 3 :(得分:0)

试试这个:

select Top 10 
student , (case when grade1 is null then grade2 else grade1 end ) as g1 , grade2 as g2 from table order by g1 desc

答案 4 :(得分:0)

另一种方法是先找到10名成绩最低的学生1。将1级重命名为年级。然后找到最低等级2的10名学生。将2级重命名为年级。在那之后联合这两个结果。从那里,找到10名成绩最低的学生。 SQL类似于:

SELECT id, grade
FROM   (SELECT   id, grade1 AS grade
        FROM     students
        ORDER BY grade1 DESC
        LIMIT 10
        UNION
        SELECT   id, grade2 AS grade
        FROM     students
        ORDER BY grade2 DESC
        LIMIT 10)
ORDER BY grade DESC
LIMIT 10