2013-06-19 50 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 

sub1sub2等包含受试者的标记。现在我想要一个显示学生信息的查询,其中超过2个科目的成绩超过35分

+0

欢迎的StackOverflow!尽快格式化你的问题。你说过你之前搜索过,所以你必须知道如何适当的格式。除了提供样本数据,基于它的期望输出以及您当前的查询版本。 – peterm

+0

你使用sql server吗? –

+0

再次提供示例数据,显示您在超过2个科目*中具有> 35分的含义*。你使用的是什么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 
----------------- 
rollno  int 
Subject_ID int --(FK) 
Subject_Val int 

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

你做这个小变化后,事情会变得更加清晰