【问题标题】:SQL Query for TOP 10 depending on two columnsTOP 10 的 SQL 查询取决于两列
【发布时间】:2013-03-08 19:11:16
【问题描述】:

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

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

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

【问题讨论】:

  • 为了快速获得更好的答案,您可以在您的问题中添加您的表结构或/和您的书面 SQL 查询。
  • 如果这些答案之一对您有用,请记住将其标记为已接受。 :-)

标签: php html sql sql-server


【解决方案1】:

可以在 order by 子句中使用大小写

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

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

【讨论】:

  • @MattBusche 我正在尝试在此解决方案中包含一个 COUNT 子句,因为我只希望在学生 ID(此表中的列)出现 3 次或更多时包含行。你知道我该怎么做吗?
【解决方案2】:

在 SQL Server 中你想使用isNull()

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

【讨论】:

  • 感谢您的回答以及您在本主题中的积极参与。
【解决方案3】:

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

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

See here 了解有关COALESCE 的更多详细信息。

【讨论】:

  • 你也可以通过 SQL Server 中的新列名而不是你的整个函数来排序。
【解决方案4】:

试试这个:

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

【讨论】:

  • 为什么需要子查询?
【解决方案5】:

另一种方法是先找出成绩最低的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多