2013-06-19 4 views
4

Je l'ai recherché sur SO, mais je n'ai pas pu obtenir une bonne réponse.Requête SQL pour afficher les données de plusieurs tables

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

L'autre table est

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

sub1, sub2, etc. contiennent les marques de sujets. Maintenant je veux une requête qui montrera l'information d'étudiant qui a> 35 marques dans plus de 2 sujets?

+0

Bienvenue sur StackOverflow! Dès que possible formatez votre question correctement. Vous avez dit que vous avez cherché SO avant, donc vous devez savoir comment le formatage ressemble. En outre fournir des exemples de données, la sortie souhaitée basée sur elle, et votre version actuelle de la requête. – peterm

+0

Utilisez-vous sql server? –

+0

Encore une fois, fournissez des exemples de données qui montrent ce que vous entendez par * a> 35 points dans plus de 2 sujets *. Et quel RDBMS utilisez-vous (SQL Server, MySql, Oracle ...)? – peterm

Répondre

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

Je suis nouveau dans le codage aussi, mais u peut essayer quelque chose comme ça, mais avant toujours faire de la question plus claire

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

la syntaxe est incorrecte et même le vous considérez tous les sujets pour être plus grand que 35 ce qui n'est pas le cas –

+0

Thnks je juste mal compris la question – 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

Essayez cette

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

Vous pouvez utiliser CASE WHEN et résumer la les champs qui en ont plus de 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; 

Vous pouvez le vérifier à partir d'ici SQL Fiddle..

0

votre table de marques peut être normalisée d'abord!

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

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

après que vous faites ce petit changement, les choses deviendront plus claires

Questions connexes