[英]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.