如何获取前一行的相应值

时间:2017-07-11 06:22:27

标签: sql

假设我们有4个类,分别是ClassA,ClassB,ClassC和ClassD。请按照下表。

Class Name                Grade           Class Name                Grade
-------------------------------------------------------------------------
ClassA                      O             ClassA                      O 
S1                                        S1                          O
S2                                        S2                          O
ClassB                      A             ClassB                      A
S3                                        S3                          A
S4                                        S4                          A
ClassC                      B             ClassC                      B
S5                                        S5                          B
S6                                        S6                          B
ClassD                      C             ClassD                      C
S7                                        S7                          C
S8                                        S8                          C

我有第一张桌子。我希望使用sql查询将表显示为第二个。描述如下。

如果一个班级有成绩,那么其学生也应该具有相同的成绩。例如对于ClassA,成绩为O,因此对于其学生(S1和S2)也应该具有O级。对于其他学生也应如此。意味着他们应该得到与他们的班级相对应的等级。学生和班级列在同一列中,如上表所示。

任何人都可以回答吗?如何使用sql查询显示不同班级各自学生的各自成绩?提前致谢

1 个答案:

答案 0 :(得分:0)

如果这些数据在同一个表中,我认为这是一个糟糕的设计,您可以使用以下查询来获得所需的输出。当然,我认为你在学生和他所在的班级之间有一个联系。

DECLARE @table TABLE(Id INT, ClassId INT, Name VARCHAR(25), Grade CHAR(1))
INSERT INTO @table VALUES
(1,NULL,'Class A','O'),
(2,1,'S1',NULL),
(3,1,'S2',NULL),
(4,NULL,'Class B','A'),
(5,4,'S3',NULL),
(6,4,'S4',NULL),
(7,NULL,'Class C','B'),
(8,7,'S5',NULL),
(9,7,'S6',NULL),
(10,NULL,'Class D','C'),
(11,10,'S7',NULL),
(12,10,'S8',NULL)

SELECT a.Name, a.Grade
FROM (
    SELECT  1 AS cOrder, c.Id, c.Name, c.Grade
    FROM    @table AS c
    WHERE   ClassId IS NULL
    UNION ALL
    SELECT  2 AS cOrder, s.Id, s.Name, c.Grade
    FROM    @table AS s
        INNER JOIN @table AS c ON c.Id = s.ClassId
    WHERE s.ClassId IS NOT NULL ) AS a
ORDER BY a.Id, a.cOrder

<强>结果

Name     Grade
Class A  O
S1       O
S2       O
Class B  A
S3       A
S4       A
Class C  B
S5       B
S6       B
Class D  C
S7       C
S8       C