TOP10的SQL查询取决于两列


SQL Query for TOP 10 depending on two columns

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

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

我真的很感激帮助创建一个能够完成这项任务的查询,我一直在研究解决方案,但它只会让我更加困惑。

您可以通过子句在订单中使用case

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

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

在SQL Server中,您希望使用isNull()

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

COALESCE函数可以执行您想要的操作。如果COALESCE(GRADE1, GRADE2)不为空,则显示GRADE1;如果GRADE1为空,将显示GRADE2

所以你可以用ORDER BY COALESCE(GRADE1, GRADE2) 代替ORDER BY GRADE1

有关COALESCE的更多详细信息,请参阅此处。

试试这个:

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

另一种方法是首先找到成绩最低的10名学生1。将grade1重命名为grade。然后找出成绩最低的10名学生2。将grade2重命名为grade。在那次联合之后,这两个结果。从中找出成绩最低的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