假设我们有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查询显示不同班级各自学生的各自成绩?提前致谢
答案 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