数据透视后的 SQL Server 分组依据

问题描述 投票:0回答:1

我想了解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 对标记进行分组并删除(空)。

sql-server tsql
1个回答
0
投票

您永远不应该使用

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.