【问题标题】:write a query to this..?写一个查询这个..?
【发布时间】:2016-12-13 11:35:10
【问题描述】:

学生和成绩。 Students 包含三列 ID、Name 和 Marks、Grades-(grade,min_mark,max_mark)

Ketty 给 Eve 一个任务来生成一个包含三列的报告:名称、等级和标记。 Ketty 不想要那些成绩低于 8 分的学生的姓名。报告必须按成绩降序排列——即首先输入更高的成绩。如果分配给他们的同一年级 (1-10) 的学生不止一名,请按这些特定学生的姓名字母顺序排列这些学生。最后,如果分数低于 8 分,则使用“NULL”作为他们的名字,并按分数升序排列。

写一个查询来帮助 Eve。

注意 如果成绩小于8,则打印“NULL”作为名称。

我已经写了这个查询:

select name,grade,marks from students s join grades g on marks between min_mark and max_mark
where grade>7
order by 2 desc,name

select translate(name,name,'NULL'),grade,marks from students s join grades g on marks between min_mark and max_mark
where grade<=7
order by 3 desc

但不知道如何加入这两个查询。

【问题讨论】:

  • 所以这看起来像是家庭作业
  • 题是直接从HackerRank复制的

标签: mysql sql sql-server oracle


【解决方案1】:

大概是这样的:

SELECT CASE WHEN g.grade < 8 THEN NULL ELSE s.name END as name,
    g.grade, s.marks 
FROM students AS s 
INNER JOIN grades AS g 
ON s.marks BETWEEN g.min_mark AND g.max_mark
ORDER BY g.grade DESC, s.name;

【讨论】:

【解决方案2】:
SELECT CASE WHEN Grades.Grade < 8 THEN NULL ELSE Students.Name END as name,
   Grades.Grade, Students.Marks 
FROM Students INNER JOIN Grades 
ON Students.Marks BETWEEN Grades.Min_mark AND Grades.Max_mark
ORDER BY Grades.Grade DESC, Students.Name;

【讨论】:

    【解决方案3】:
    select case
    when grade < 8 then NULL
    else
    name
    end
    as name, grade, marks
    from students, grades
    where marks between min_mark and max_mark
    order by grade desc, name asc, marks asc;
    

    【讨论】:

    • 一个简短的代码 sn-p 经常需要解释的话对未来的读者有用。关于应该在两个表上施加什么 JOIN 条件有点猜测,但是您没有提供 studentsgrades 之间的任何连接,因此这与最初提出的问题相比有些退步。跨度>
    • 感谢@hardmath 您的意见。实际上,上面的查询使用 where 子句进行了隐式连接。如果可能,我更喜欢显式连接上的隐式连接,
    【解决方案4】:
    SELECT 
    CASE 
        WHEN G.Grade < 8 THEN NULL
        ELSE S.Name
    END,
    G.Grade, S.Marks
    FROM Students AS S
    JOIN Grades AS G
    ON S.Marks BETWEEN G.Min_Mark AND G.Max_Mark
    ORDER BY G.Grade DESC, S.Name ASC;
    

    【讨论】:

    • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请edit你的答案-From Review
    【解决方案5】:

    这是我的回答,但他并不完美: 也许从那,你可以解决

    grades.grade, students.marks,
    case
        when grades.grade < 8 then "null"
        else students.name
        end as NNN
    from students
    inner join grades on students.marks between grades.min_mark and grades.max_mark
    order by grades.grade desc;
    

    【讨论】:

      【解决方案6】:

      你也可以试试下面的 SQL 查询:

      SELECT CASE WHEN (STUDENTS.MARKS < 70) THEN 'NULL' ELSE STUDENTS.NAME END,
              GRADES.GRADE, STUDENTS.MARKS
      FROM STUDENTS, GRADES
      WHERE STUDENTS.MARKS >= GRADES.MIN_MARK AND STUDENTS.MARKS <= GRADES.MAX_MARK
      ORDER BY GRADES.GRADE DESC, STUDENTS.NAME ASC;
      

      SELECT CASE WHEN (STUDENTS.MARKS < 70) THEN 'NULL' ELSE STUDENTS.NAME END,
              GRADES.GRADE, STUDENTS.MARKS
      FROM STUDENTS, GRADES
      WHERE STUDENTS.MARKS BETWEEN GRADES.MIN_MARK AND GRADES.MAX_MARK
      ORDER BY GRADES.GRADE DESC, STUDENTS.NAME ASC;
      

      【讨论】:

        【解决方案7】:

        在hackerrank上尝试和测试过的代码...

        select s.name, g.grade, s.marks from students s, grades g where g.grade>=8 and s.marks between g.min_mark and g.max_mark order by g.grade desc, s.name;
        
        select 'NULL', g.grade, s.marks from students s, grades g where g.grade<8 and s.marks between g.min_mark and g.max_mark order by g.grade desc, s.marks;
        

        【讨论】:

          【解决方案8】:
          SELECT 
          
            CASE 
            WHEN marks >= 70 THEN name
            ELSE NULL
            END AS req_name,
           
            CASE
            WHEN marks BETWEEN 0  AND 9  THEN 1
            WHEN marks BETWEEN 10 AND 19 THEN 2
            WHEN marks BETWEEN 20 AND 29 THEN 3
            WHEN marks BETWEEN 30 AND 39 THEN 4
            WHEN marks BETWEEN 40 AND 49 THEN 5
            WHEN marks BETWEEN 50 AND 59 THEN 6
            WHEN marks BETWEEN 60 AND 69 THEN 7
            WHEN marks BETWEEN 70 AND 79 THEN 8
            WHEN marks BETWEEN 80 and 89 THEN 9
            WHEN marks BETWEEN 90 and 100 THEN 10
            END AS grade,
           
            marks
           
          FROM students
          ORDER BY grade DESC, req_name, marks ASC
          

          【讨论】:

          • 而不是简单地发布代码,您应该解释为什么应该考虑这个答案而不是已经发布的其他答案,例如您为什么要重新计算成绩?尤其是当这应该是使用连接的练习时。
          【解决方案9】:

          这在 MySQL 中对我有用 -

          select if(Grade < 8, NULL , Name), Grade, Marks
          from Students
          Inner Join Grades
          where Marks between Min_Mark AND Max_Mark
          ORDER BY GRADE DESC, Name ASC;
          

          【讨论】:

            【解决方案10】:

            这个答案不像以前的答案那么优雅,而是我如何拼凑出一个解决方案。 看到这里的解决方案后,我建议使用 JOIN、ON 和 BETWEEN 语句而不是我的解决方案,我使用最左边的字符并添加一个以使其与我在第二个表中看到的值对齐。 如果您在我上面提到的之外发现任何缺陷,请发表评论,以便我改进。

            SELECT 
            CASE 
                WHEN LEFT(MARKS, 1) + 1 < 8 AND MARKS != 100 THEN NULL
                ELSE NAME
            END AS NAME, 
            CASE 
                WHEN MARKS = 100 THEN 10
                ELSE LEFT(MARKS, 1) + 1
            END AS GRADE, MARKS 
            FROM STUDENTS
            ORDER BY GRADE DESC,
            (CASE WHEN GRADE >= 8 THEN NAME END),
            (CASE WHEN GRADE < 8 THEN MARKS END) ASC
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-13
              • 2015-08-15
              • 2021-10-21
              • 1970-01-01
              相关资源
              最近更新 更多