2013-06-13 44 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 

儘量不要使用不同的,它是一個糟糕的編碼