Sql 如何使用子查询查询学生成绩?

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

我是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
请任何人帮帮我! 谢谢

您可以尝试:

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答案使用透视表。