【问题标题】:SQL query to arrange marks of students in descending order [closed]SQL查询以降序排列学生的分数[关闭]
【发布时间】:2014-01-04 17:47:00
【问题描述】:

我在 SQL Server 2000 表中有一个名为 student 的表,用于存储不同学科学生的分数,它看起来像

name | English | Math | Science
--------------------------------
Ram  | 80      | 70   | 85
shyam| 70      | 80   | 65
Hari | 80      | 60   | 90

现在我想要 3 列中的结果,其中包含名称、主题和标记,并且标记列根据每个学生的主题按降序排列为

name  | Subject | marks
------------------------
Ram   | Science | 85
Ram   | english | 80
Ram   | math    | 70
shyam | math    | 80
shyam | english | 70
shyam | Science | 65
Hari  | Science | 90
Hari  | english | 80
Hari  | math    | 60

我尝试了很多但没有成功。所以我寻求帮助。谢谢

【问题讨论】:

  • 请发布您的尝试。
  • 你要降序哪个标记?
  • 科目分数降序排列
  • "MySQL" 并不意味着“我试图运行的 SQL 代码”。如果您使用的是 SQL Server,请不要使用 MySQL 或其他非 SQL Server 平台进行标记。

标签: sql sql-server sql-server-2000


【解决方案1】:

您可以通过这种方式翻转您的表格

SELECT name,
       subject,
       CASE subject
       WHEN 'english' THEN english
       WHEN 'math'    THEN math
       WHEN 'science' THEN science
       END marks
  FROM student s CROSS JOIN
(
  SELECT 'english' subject UNION ALL
  SELECT 'math' UNION ALL
  SELECT 'science'
) t
 ORDER BY name, marks DESC

输出:

|姓名 |主题 |标记 | |-------|---------|--------| |哈里 |科学 | 90 | |哈里 |英语 | 80 | |哈里 |数学 | 60 | |拉姆 |科学 | 85 | |拉姆 |英语 | 80 | |拉姆 |数学 | 70 | |害羞 |数学 | 80 | |害羞 |英语 | 70 | |害羞 |科学 | 65 |

这里是SQLFiddle演示

【讨论】:

  • +1 为性能考虑!此外,由于没有重复项,因此无需对 t 子查询进行 UNION ALL :)
  • @JorgeCampos 谢谢 :) 相反,UNION ALL 正是这里需要的,以防止尝试删除重复条目,这是完全不必要的步骤。
  • 到底有帮助吗?
【解决方案2】:

试试这个:

SELECT name, grad as subject, mark
  FROM
      (
      SELECT name, english as mark, 'english' as grad FROM student
      UNION
      SELECT name, math, 'math' FROM student
      UNION
      SELECT name, nepali, 'nepali' FROM student
      ) as t
ORDER BY name, mark DESC

在 fiddle 上看到它:http://sqlfiddle.com/#!2/17dd2/3

但请记住,您的桌面设计不佳。你应该有一张有学生的桌子和一张有毕业生(数学、英语等)的桌子,还有一张是这两者与标记之间的 N-m 关系。

【讨论】:

  • 为什么是UNION 而不是UNION ALL?如果有 5、12、36 门课程等,这也会变得混乱 - 必须单独进行的扫描次数......
  • 因为 UNION 做了一个 distinc 并且作为 grad 字段保证它永远不会等于注册表,所以没有必要 UNION ALL 不做 DISTINCT
  • 关于混乱的部分,你是对的。这就是为什么我认为 OP 设计不好的原因。
猜你喜欢
  • 2012-03-06
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多