SELECT
SUM(
CASE 行转列字段(对应下文中SubjectName)
WHEN 行转列字段数据(对应下文中语文/数学/外语) THEN 行转列字段(对应下文中StuScore)
ELSE 0
END
) AS 别名,
FROM 表名 GROUP BY 分组字段
DECLARE @StudentMark TABLE
(
id INT IDENTITY(1,1),
StuName NVARCHAR(50),
SubjectName NVARCHAR(50),
StuScore FLOAT,
CreateDate DATETIME
)
INSERT INTO @StudentMark
(
StuName,
SubjectName,
StuScore,
CreateDate
)
VALUES
( N'张三',
N'语文',
95.5,
GETDATE()
),
( N'张三',
N'数学',
97,
GETDATE()
),
( N'张三',
N'外语',
90,
GETDATE()
),
( N'李四',
N'语文',
90.5,
GETDATE()
),
( N'李四',
N'数学',
98,
GETDATE()
),
( N'李四',
N'外语',
90,
GETDATE()
)
用 Select * From @StudentMark
id | StuName | SubjectName | StuScore | CreateDate |
1 | 张三 | 语文 | 95.0 | 2022-06-13 10:59:01.870 |
2 | 张三 | 数学 | 97 | 2022-06-13 10:59:01.870 |
3 | 张三 | 外语 | 90 | 2022-06-13 10:59:01.870 |
4 | 李四 | 语文 | 90.5 | 2022-06-13 10:59:01.870 |
5 | 李四 | 数学 | 98 | 2022-06-13 10:59:01.870 |
6 | 李四 | 外语 | 90 | 2022-06-13 10:59:01.870 |
这种并不是我们想要的结果,我们想要的是这样的
如下:
StuName | 语文 | 数学 | 外语 |
张三 | 95.5 | 98 | 90 |
李四 | 90.5 | 98 | 90 |
这时候就需要用到行转列
如下:
select
StuName,
SUM(case SubjectName when '语文' then StuScore else 0 end) AS 语文 ,
SUM(case SubjectName when '数学' then StuScore else 0 end) AS 数学 ,
SUM(case SubjectName when '外语' then StuScore else 0 end) AS 外语
FROM @StudentMark group by StuName
即可获得想要的数据