2012-01-19 58 views
1

我是一個新來的SQL Server,我有一些問題要問。我有表如下圖所示:如何使用子查詢來查詢學生成績?

NAME GRADE SUBJECT 
JOHN A  MATH 
JOHN C  PHYSIC 
JENNY B  PHYSIC 
JENNY C  MATH 
KENNY A  MATH 
KENNY B  PHYSIC 

.....

我想查詢到

NAME MATH PHYSIC 
JOHN A  C 
JENNY C  B 
KENNY A  B 

任何一個可以幫助我請! 感謝

+0

我相信PIVOT關係運算符將在這種情況下工作,雖然我沒有很多的經驗,實現它自己。 http://msdn.microsoft.com/en-us/library/ms177410.aspx – hqrsie

回答

2

你可以試試:

SELECT t.name, q1.grade AS Math, q2.grade AS Physic 
    (SELECT grade FROM your_table t1 
    WHERE t.name = t1.name 
    AND t1.subject = "MATH") q1, 
    (SELECT grade FROM your_table t2 
    WHERE t.name = t2.name 
    AND t2.subject = "PHYSIC") q2 
FROM your_table t 
GROUP BY name 
+1

子查詢的效率可能比僅將表加入兩次的效率要低。 – JNK

5

如果不是所有的名字都年級所有科目

SELECT 
    b.name, m.grade AS MATH, p.grade AS PHYSIC 
FROM 
    (
    SELECT DISTINCT name FROM MyTable 
    ) b 
    LEFT JOIN 
    MyTable m ON b.name = m.name AND m.subject = "MATH" 
    LEFT JOIN 
    MyTable p ON b.name = p.name AND p.subject = "PHYSIC" 
+0

感謝所有,但如果我有更多的學科如學校記分牌,我有主題表加入由subject_id得分表我怎麼能查詢? – aliasosx

+1

@aliasosx;:這將是一個新問題。並提供更多信息 – gbn

0

你可以得到所有記錄的一個主題,並在同一個表連接對於其他主題的記錄:

select 
    m.NAME, 
    m.GRADE as MATH, 
    p.GRADE as PHYSIC 
from 
    thetable m 
    inner join thetable p on p.NAME = m.NAME and p.SUBJECT = 'PHYSIC' 
where 
    m.SUBJECT = 'MATH' 
+2

當然,我們希望所有名稱在這兩個主題中都有成績... – gbn

+0

如果他們不這樣做,您可以將「內部聯接」更改爲「左外部聯接」或根據我的情況使用數據透視表或tpolyak答案。 –

4

您可以使用PIVOT(因爲SQL Server 2005):

SELECT * 
FROM (SELECT Name, Subject, Grade FROM Grades) o 
PIVOT(MAX(Grade) FOR Subject IN ([Math], [Physic])) p 

內PIVOT()操作符,你必須定義一個聚合函數,如果每個人都可以有一個受試者級,然後MAX()或MIN()是完美的。

+0

感謝tpolyak我們如何能夠改變PIVOT()中的聚合函數來提供Grade值String? – aliasosx

+1

@aliasosx MAX()和MIN()函數也支持字符串 – tpolyak

0

使用PIVOT一個例子:

DECLARE @Students TABLE 
(
    name varchar(10), 
    grade char(1), 
    [subject] varchar(10) 
); 

INSERT INTO @Students VALUES ('JOHN', 'A', 'MATH'); 
INSERT INTO @Students VALUES ('JOHN', 'C', 'PHYSIC'); 
INSERT INTO @Students VALUES ('JENNY', 'B', 'PHYSIC'); 
INSERT INTO @Students VALUES ('JENNY', 'C', 'MATH'); 
INSERT INTO @Students VALUES ('KENNY', 'A', 'MATH'); 
INSERT INTO @Students VALUES ('KENNY', 'B', 'PHYSIC'); 

SELECT * 
FROM @Students AS Students 
PIVOT 
( 
    MAX(Grade) 
    FOR [subject] IN ([MATH], [PHYSIC]) 
) AS StudentGrades 
+0

謝謝ƉiamondǤeezeƦ。我可以用子查詢改變「IN([Maths],[Physics])」?像「IN(select subject from subject_table)」 – aliasosx

+0

不需要。您將不得不根據本文動態構建查詢:[使用SQL Server 2005中的動態列的樞軸](http://www.simple-talk.com/社區/博客/安德拉什/存檔/ 2007/09/14/37265.aspx) –

相關問題