【问题标题】:Ms Access database student rank for same markMS Access 数据库学生排名相同的分数
【发布时间】:2020-08-11 07:37:00
【问题描述】:

我有一张这样的桌子:

### Table name: studentresult ###
Name    Cls Roll Mark result Rank
Jubayer 10  1    600  Pass 
Jewel   10  2    620  Pass
James   10  3    590  Pass
Jemi    10  4    590  Pass
Kalis   10  5    449  Fail
Lelin   10  6    600  Pass

我想自动生成学生的排名。排名将取决于分数(分数越高意味着排名越高)。如果两个学生(或更多)的分数相同,则掷骰将确定相对排名(较低的掷骰意味着更好的排名)。最后,如果一个学生失败了,他将不会被考虑在排名中。

在我的例子中,结果是这样的:

Name   Cls Roll Mark result Rank
Jubayer 10  1   600  Pass   2
Jewel   10  2   620  Pass   1
James   10  3   590  Pass   4
Jemi    10  4   590  Pass   5
Kalis   10  5   449  Fail  **
Lelin   10  6   600  Pass   3

【问题讨论】:

  • 如果您使用额外的列,那么您可以轻松完成。额外的列表示仅用于计算的辅助列。

标签: sql ms-access rank


【解决方案1】:
SELECT 
name,
Cls,
Roll,
Mark,
CASE WHEN t.result LIKE 'Pass' THEN a.pos+1
WHEN t.result LIKE 'Fail' THEN '**'
END as Rank

FROM table t
CROSS JOIN (SELECT posexplode(split(repeat(',', 70), ','))) a
ORDER BY t.Roll

如果您有 70 名学生,这将创建 70 行。

【讨论】:

  • 答案是否适用于MS-Access 数据库?我认为它适用于MSSQL 服务器。
【解决方案2】:

我刚刚修改了 GordonLinoff 先生答案的代码。试试下面的查询...

SELECT sr.*, IIf(sr.result="Pass",(select count(*)
            from Table1 as sr2
            where sr2.result = "Pass" and
                  (sr2.Mark*10000-sr2.roll >= sr.Mark*10000-sr.roll and sr2.roll = sr2.roll
                  )
           ),Null) AS ranking
FROM Table1 AS sr;

【讨论】:

  • 我可以通过电子邮件或Messenger或fb与您联系吗?
  • 是的,你可以。 harun24hr@gmail.com 和 facebook 个人资料是 harun24hr
【解决方案3】:

您可以使用我的项目RowNumbers 中的通用函数RowRank

此处发布的代码过多,但请转到第 5 段。排名了解详情。

示例

有点棘手,因为 Mark 是按 Desc 排序,而 Roll 是按 Asc 排序:

SELECT 
    studentresult.Name, 
    studentresult.Cls, 
    studentresult.Roll, 
    studentresult.Mark, 
    studentresult.Pass, 
    IIf([Pass]='Pass',RowRank("[Mark],-[Roll]","(select * from studentresult where Pass='Pass')",[Mark],-[Roll],2),Null) AS Rank
FROM 
    studentresult;

输出:

【讨论】:

  • 我可以联系你吗?我无法解决。请将此项目文件发送到我的电子邮件。电子邮件:jubayer.jewel@gmail.com
  • 我可以通过电子邮件与您联系吗?
  • 先生,我已经检查过了。当出现另外 2 个相同的数字时,这将无法正常工作,然后排名将显示 0 。这是个大问题。
【解决方案4】:

在 MS Access 中,您可以使用关联子查询:

select sr.*,
       iif(sr.result = "Pass",
           (select count(*)
            from studentresult as sr2
            where sr2.result = "Pass" and
                  (sr2.Mark > sr.Mark or
                   sr2.Mark = sr.Mark and sr2.roll <= sr.roll
                  )
           ),
           NULL
       ) as ranking
from studentresult as sr;

请注意,这使用NULL 表示失败的缺失值。这比'**' 方便多了。您可以使用后者,但您需要将数字转换为字符串,以便整个列都是字符串。 NULL 可以正常工作。

【讨论】:

  • 这不能正常工作。参数被找到并且不及格的学生也在排名中。这是不可接受的
  • @Jewel 。 . .不,不及格的学生不在排名中。这就是sr2.result = "Pass" 所做的。
  • @GordonLinoff 失败的学生没有排名,但重复的分数排名将作为重复出现。对于标记590,排名显示为 5,5。
  • @Harun24HR 。 . .查询中有错字。关联条件只涉及一个表,而不是两个。
  • @GordonLinoff 我认为sr2.roll &lt;= sr1.roll 中仍然存在拼写错误。它将是sr2.roll &lt;= sr.roll。没有名称为 sr1alis
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
相关资源
最近更新 更多