2013-06-19 2 views
4

Я искал его на SO, но я не мог получить правильный ответ.SQL-запрос для отображения данных из нескольких таблиц

Student 
------------------ 
rollno int PK 
name varchar(20) 
class varchar(20) 

Другой таблица

Marks 
----------------- 
rollno FK 
sub1 int 
sub2 int 
sub3 int 
sub4 int 
sub5 int 

sub1, sub2 и т.д. содержат следы предметов. Теперь мне нужен запрос, в котором будет отображаться информация о студенте, у которого есть> 35 баллов в более чем двух предметах?

+0

Добро пожаловать в StackOverflow! Как можно скорее отформатируйте свой вопрос правильно. Вы сказали, что вы обыскали SO раньше, поэтому вам нужно знать, как выглядит правильное форматирование. Кроме того, предоставить образцы данных, желаемый результат на основе этого и текущую версию запроса. – peterm

+0

Используете ли вы сервер sql? –

+0

Снова предоставим образцы данных, которые показывают, что вы имеете в виду * имеет> 35 баллов в более чем 2 предметах *. И какие RDBMS вы используете (SQL Server, MySql, Oracle ...)? – peterm

ответ

2
select rollno, 
case when sub1 < 35 then 0 else 1 end + 
case when sub2 < 35 then 0 else 1 end + 
case when sub3 < 35 then 0 else 1 end + 
case when sub4 < 35 then 0 else 1 end + 
case when sub5 < 35 then 0 else 1 end + 
end 
as [Count] 
from student,marks where count > 2 
-1

Я новичок в кодировании тоже, но у может попробовать что-то подобное, но, прежде чем всегда сделать вопрос понятнее

SELECT student.* from student InnerJoin marks ON studnet.roll_no=marks.student) where (sub1>=35 && sub2>=35 and so on) 
+0

неверен и даже вы считаете, что все предметы будут больше 35, что не так. –

+0

Thnks Я просто неправильно понял вопрос – Desire

0
DECLARE @tempRollnoTable(rno int) 

INSERT INTO @tempRollnoTable 
SELECT rollno FROM marks 
WHERE sub1 > 35 

UNION ALL 

SELECT rollno FROM marks 
WHERE sub2 > 35 

UNION ALL 

SELECT rollno FROM marks 
WHERE sub3 > 35 

UNION ALL 

SELECT rollno FROM marks 
WHERE sub4 > 35 

UNION ALL 

SELECT rollno FROM marks 
WHERE sub5 > 35 



SELECT * FROM student 
WHERE rollno IN (SELECT rno FROM @tempRollnoTable 
        GROUP BY rno HAVING COUNT(*) > 2) 
0

Попробуйте

select student.* from student inner join marks on student.rollno= marks.rollno 
    where marks.rollno in(
     Select a.* from (
     Select RollNo from marks where sub1>35 
     Union ALL 
     Select RollNo from marks where sub2>35 
     Union ALL 
     Select RollNo from marks where sub3>35 
     Union ALL 
     Select RollNo from marks where sub4>35 
     Union ALL 
     Select RollNo from marks where sub5>35) a 
     having(rollno)>1) 
1

Вы можете использовать CASE WHEN и суммировать которые имеют более 35.

SELECT s.rollno, s.name, s.class 
FROM Student s join Marks m on (s.rollno = m.rollno) 
where (CASE WHEN sub1>35 THEN 1 ELSE 0 END + 
    CASE WHEN sub2>35 THEN 1 ELSE 0 END + 
    CASE WHEN sub3>35 THEN 1 ELSE 0 END + 
    CASE WHEN sub4>35 THEN 1 ELSE 0 END + 
    CASE WHEN sub5>35 THEN 1 ELSE 0 END) > 2; 

Вы можете это проверить здесь SQL Fiddle..

0

Ваша таблица Marks может быть нормализована в первую очередь!

Marks 
----------------- 
rollno  int 
Subject_ID int --(FK) 
Subject_Val int 

Subjects 
----------------- 
ID    int 
Subject_Name varcahar(20) 

после вы делаете это небольшое изменение, все станет более ясным

Смежные вопросы