2013-06-13 40 views
0

我有这个表如何查询VARCHAR和int

name | prof  |grade 
------------------------ 
yossi math  100 
tami math  70 
yossi phisic 100 
tami phisic 100 
oren math  100 
oren phisic 80 
dor  history 70 

查询应返回学生的名字已在数学100级和phisic 正确unswer是贝纳 我用下面的

SELECT name FROM [dbo].[Class_grade] 
where prof in ('math', 'phisic') and grade = 100 

但它返回更多的名字为什么? 什么是正确的查询? 感谢

+2

回答到:“为什么?”是因为您的查询搜索在'数学'或'物理'中获得100分成绩的学生 –

回答

-2

试试这个:

SELECT DISTINCT name FROM [dbo].[Class_grade] where prof in ('math', 'phisic') and grade = 100 

这会工作,以及:

SELECT DISTINCT name FROM [dbo].[Class_grade] where (prof = 'math' and grade = 100) OR (prof = 'phisics' and grade = 100) 
+0

此查询返回多个名字 – isl65

+1

第二个不起作用,因为教授不能在数学和phisic处同一时间 –

+0

我认为“in('math','phisic')”不是“和”运算符,这就是为什么它返回多个答案的原因 – isl65

1

早些时候,我错误地引用了Question

您可以使用Group by caluse

SELECT name FROM [Class_grade] 
where prof in ('math', 'phisic') and grade = 100 
group by (name) 
having count(1)=2 

SQL FIDDLE

+0

即使没有'grade = 100 ''数学'和'phisic' –

+0

@DanielDinnyes我错误地引用了问题 – Luv

6
select name 
from Class_Grade 
where grade = 100 and 
     prof in ('math', 'phisic') 
group by name 
having count(distinct prof) = 2 

组通过name和使用having过滤掉的行。确保你计算了prof的不同事件。在这种情况下,它是2,因为你的in子句中有2个值。

0

组通过,并suure你两行

SELECT name 
FROM Class_grade 
WHERE prof in ('math', 'phisic') and grade = 100 
GROUP BY name 
HAVING count(*) = 2 

http://www.sqlfiddle.com/#!3/9308c/6

编辑 你可以抓住不同的等级,如果同样的学生可以在主题有一个以上的100%

SELECT name 
FROM (
    SELECT DISTINCT name, prof, grade 
    FROM Class_grade 
    WHERE prof in ('math', 'phisic') and grade = 100 
) class_grade 
GROUP BY name 
HAVING count(*) = 2 

http://www.sqlfiddle.com/#!3/79fd0/11

+0

不起作用,如果学生可以有多个成绩每个主题:[示例](http://www.sqlfiddle.com/#!3/79fd0/2/0) –

+0

已更新,以考虑到这一点 –

0

试试这个

SELECT name FROM Class_grade 
WHERE prof IN ('math', 'phisic') AND grade=100 
GROUP BY name 
HAVING COUNT(name) > 1 
+0

不起作用,如果学生可以有多个成绩每个主题:[示例](http://www.sqlfiddle.com/#!3/79fd0/3/0) –

0

的OP未说明几个细节:

  • 关于什么是表的主键(即可以为同一学科的同一名学生存在多行)
  • 当有多个学生符合条件时,预期结果如何。

如果我们假设一个学生在同一个科目中可以有多个成绩,其他许多答案在HAVING COUNT(*)条款中都是错误的。Mikael Eriksson's answer满足这个假设,它可能比我下面的解决方案更好的性能(虽然功能不同的有点太):

SELECT DISTINCT name FROM [dbo].[Class_grade] cg1 
WHERE EXISTS (
    SELECT 1 FROM [dbo].[Class_grade] cg2 
    WHERE cg2.name = cg1.name 
    AND cg2.prof = 'math' 
    AND cg2.grade = 100) 
AND EXISTS (
    SELECT 1 FROM [dbo].[Class_grade] cg2 
    WHERE cg2.name = cg1.name 
    AND cg2.prof = 'phisic' 
    AND cg2.grade = 100) 
AND NOT EXISTS (
    SELECT 1 FROM [dbo].[Class_grade] cg2 
    WHERE cg2.name = cg1.name 
    AND cg2.prof in ('math','phisic') 
    AND cg2.grade < 100) 

在上面的代码不同的是,它只会选择只有grade = 100了谁的学生mathphisic科目,即使他们每个科目可以有不止一个年级。 See here

0
  select Class_grade.name 
      from Class_grade 
      inner join Class_grade Class_grade2 
      on Class_grade.Name = Class_grade2.name 
      where Class_grade.Prof = 'math' and Class_grade.grade = 100 
      and Class_grade2.prof = 'phisic' and Class_grade2.grade = 100 
      group by Class_grade.Name 

尽量不要使用不同的,它是一个糟糕的编码