我想了解pivot是如何工作的。我有以下架构:
CREATE TABLE Marks (
id int Primary key,
studentId int,
course varchar(255),
marks int
);
我掌握的数据是:
insert into Marks (id, studentId, course, marks)
Values
(1,1,'Phy',10),
(2,1,'Chem',20),
(3,1,'Math',10),
(4,2,'Phy',20),
(5,2,'Chem',30),
(6,2,'Math',40),
(7,3,'Phy',10),
(8,3,'Chem',40),
(9,3,'Math',10)
我正在尝试使用课程名称来调整分数。我正在使用以下查询:
select *
from Marks as m
pivot (max(m.marks) for m.course in ([Phy], [Chem],[Math])) as pivotTable
我得到的输出是:
id studentId Phy Chem Math
1 1 10 (null) (null)
2 1 (null) 20 (null)
3 1 (null) (null) 10
4 2 20 (null) (null)
5 2 (null) 30 (null)
6 2 (null) (null) 40
7 3 10 (null) (null)
8 3 (null) 40 (null)
9 3 (null) (null) 10
理想情况下,我想要这样的东西:
id | 学生ID | 物理 | 化学 | 数学 |
---|---|---|---|---|
1 | 1 | 10 | 20 | 10 |
2 | 2 | 20 | 30 | 40 |
3 | 3 | 10 | 40 | 10 |
我想了解数据透视表的工作原理以及如何按学生 ID 对标记进行分组并删除(空)。
您永远不应该使用
SELECT *
,尤其是当您需要GROUP BY
时
SELECT MIN(id) AS id, studentId, MAX(Phy) AS Phy, MAX(Chem) AS Chem, MAX(Math) AS MAX
FROM Marks AS m
PIVOT (max(m.marks) FOR m.course IN ([Phy], [Chem],[Math])) AS pivotTable
GROUP BY studentId
id | 学生ID | 物理 | 化学 | 最大 |
---|---|---|---|---|
1 | 1 | 10 | 20 | 10 |
4 | 2 | 20 | 30 | 40 |
7 | 3 | 10 | 40 | 10 |