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
即可获得想要的数据
本文通过一个实例展示了如何使用SQL进行行转列操作,将学生分数表转换为更直观的格式,便于数据汇总和分析。具体方法是利用CASE语句结合SUM函数,按学生姓名分组,将不同科目的成绩聚合在同一行内,从而实现数据展示的转换。
735

被折叠的 条评论
为什么被折叠?



