2016-04-21 103 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;