2016-04-21 105 views
1

我是SQL新手,尝试通过解决Hackerank上的问题来学习它。这是我坚持的问题。我有两个表在SQL中加入范围

Student : id, name, marks 

Grades : grade, min_marks, max_marks 

本质上的成绩表给出,

1 0 9 
2 10 19 
...... 

我试着写下面的查询,生成包含三列的报告:姓名,年级和马克。报名分数低于8的学生的姓名。报告必须按年级递减 - 即先输入更高的成绩。如果有多于一名同一年级(1-10)的学生被分配给他们,则按字母顺序排列这些特定学生的名字。最后,如果分数低于8,则使用“NULL”作为它们的名称,并按升序列出它们的标记。

我开始作曲通过在有条件的

SELECT NAME, GRADE, MARK 
FROM MARKS m 
INNER JOIN ON GRADE 

很失落查询是否有人可以帮助我如何从这里走。

+2

你应该尝试不提出解决这些问题的相关问题。我可以给你答案,但你不会学习。 –

+0

请投票选举你的论点? – Zeus

+0

Dude,你还没有查询中表格的名字。 SELECT ... FROM mytablename JOIN myothertablename ON ....在ON关键字之后是放置条件的位置,这些条件确定一个表中的行是否与另一个表中的行“匹配”。 – spencer7593

回答

0

这应该让你几乎在那里。这是不完全清楚你问什么,因为你说你想要得到的分数低于8的学生的名字。然后你说如果分数低于8,使用NULL作为他们的名字。根据这些要求,所有学生的姓名都是NULL。

SELECT 
    s.name 
    , g.grade 
    , s.marks 
FROM Student s 
JOIN Grades g on s.marks BETWEEN g.min_marks and g.max_marks 
WHERE g.grade < 8 
ORDER BY g.grade DESC, s.name ASC 
1

您的要求有冲突。任何方式。

为了获得具有较少晒黑8级的学生数据,与名

SELECT 
    s.name 
    , g.grade 
    , s.marks 
FROM Student s,Grades g 
where s.marks BETWEEN g.min_marks and g.max_marks 
and g.grade < 8 
ORDER BY g.grade DESC, s.name ASC 

如果你想要的名称为空为低于8

SELECT 
    NULL //or '' 
    , g.grade 
    , s.marks 
FROM Student s,Grades g 
where s.marks BETWEEN g.min_marks and g.max_marks 
and g.grade < 8 
ORDER BY g.grade DESC 
1

上述问题,需要有年级学生两个查询被执行。 这是我做到了,它的工作原理

select students.name,grades.grade,students.marks 
from students 
inner join grades 
on students.marks between min_mark and max_mark 
and grades.grade > 7 
order by grades.grade desc,students.name; 
select 'NULL',grades.grade,students.marks 
from students 
inner join grades 
on students.marks between min_mark and max_mark 
and grades.grade < 8 
order by grades.grade desc,students.marks asc; 

我希望这有助于

1

如果你的问题是this, 我有一个单一的查询答案:

select case when g.grade>=8 then s.name else NULL end, 
g.grade, s.marks from students s, grades g 
where s.marks between g.min_mark and g.max_mark 
order by g.grade desc, s.name asc, s.marks asc;