繁体   English   中英

取决于两列的SQL TOP 10查询

[英]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的总和),则他应该在列表中排第一。

我一直在为使查询能够完成此任务提供帮助,我一直在寻找解决方案,但它只会使我更加困惑。

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

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

您可以在order by子句中使用案例

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

编辑

我在BillyCode上发表评论说,只把那些表三遍或三遍以上的学生包括在内时,我建议这样做

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

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

COALESCE函数COALESCE您的需求。 COALESCE(GRADE1, GRADE2)将显示GRADE1如果不为空,或GRADE2如果GRADE1为空。

因此,您可以执行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级重命名为Grade。 然后找到10个最低2年级的学生。 将2级重命名为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM