Sql 如何使用子查询查询学生成绩?
我是SQL Server的新手,我有一些问题要问。我有如下表格:Sql 如何使用子查询查询学生成绩?,sql,sql-server,Sql,Sql Server,我是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
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
请任何人帮帮我!
谢谢您可以尝试:
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
您可以尝试:
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
如果不是所有的名字都有所有科目的分数
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"
如果不是所有的名字都有所有科目的分数
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"
您可以获取一个主题的所有记录,并将另一个主题的记录加入同一个表:
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'
您可以获取一个主题的所有记录,并将另一个主题的记录加入同一个表:
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'
自SQL server 2005以来,您可以使用PIVOT:
SELECT *
FROM (SELECT Name, Subject, Grade FROM Grades) o
PIVOT(MAX(Grade) FOR Subject IN ([Math], [Physic])) p
在PIVOT操作符中,您必须定义聚合函数,如果每个人对一个主题都可以有一个等级,那么MAX或MIN是完美的。自SQL server 2005以来,您可以使用PIVOT:
SELECT *
FROM (SELECT Name, Subject, Grade FROM Grades) o
PIVOT(MAX(Grade) FOR Subject IN ([Math], [Physic])) p
在PIVOT操作符中,您必须定义一个聚合函数,如果每个人对一个主题都可以有一个等级,那么MAX或MIN是完美的。使用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
使用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
我相信PIVOT关系操作符在这种情况下会起作用,尽管我自己没有很多实现它的经验。我相信PIVOT关系操作符在这种情况下会起作用,尽管我自己没有很多实现它的经验。子查询的效率可能低于两次连接表的效率。子查询的效率可能低于两次连接表的效率。谢谢大家,但如果我有更多的科目,如学校记分板,并且我有科目表按科目id连接到分数表,我如何查询?@aliasosx;:这将是一个新问题。还有更多信息,谢谢大家,但如果我有更多的科目,如学校记分板,并且我有科目表按科目id连接到成绩表,我如何查询?@aliasosx;:这将是一个新问题。还有更多信息,感谢tpolyak,我们如何更改PIVOT中的聚合函数以提供等级值字符串?@aliasosx MAX和MIN函数支持字符串,tooThanks tpolyak,我们如何更改PIVOT中的聚合函数以提供等级值字符串?@aliasosx MAX和MIN函数支持字符串,tooThanksƉiamondǤeezeƦ。我可以用子查询改变[数学],[物理]吗?如从主题表中选择主题。您必须动态构造查询,如本文所述:ThankƉiamondǤeezeƦ。我可以用子查询改变[数学],[物理]吗?如从主题表中选择主题。根据本文,您必须动态构造查询:如果没有,您可以将内部连接更改为左外部连接,或者根据my或tpolyak答案使用透视表。如果没有,您可以将内部连接更改为左外部连接,或者根据my或tpolyak答案使用透视表。