sqlserver行转列

本文详细介绍了如何使用SQL的动态查询和pivot函数实现行数据到列数据的转换,通过具体案例展示了stuff()和isnull()函数在构建动态SQL语句中的应用,适用于需要进行数据透视或报表展示的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一丶行专列案例【借鉴

1.建立表格

IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb

go

CREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT)

insert into tb VALUES ('张三','语文',74)
insert into tb VALUES ('张三','数学',83)
insert into tb VALUES ('张三','物理',93)
insert into tb VALUES ('李四','语文',74)
insert into tb VALUES ('李四','数学',84)
insert into tb VALUES ('李四','物理',94)

go

SELECT * FROM tb

go

动态sql

--使用stuff()

DECLARE @sql VARCHAR(8000)

SET @sql=''  --初始化变量 @sql

SELECT @sql= @sql+',' + 课程 FROM tb GROUP BY 课程 --变量多值赋值

SET @sql= STUFF(@sql,1,1,'')--去掉首个','

SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

PRINT @sql

exec(@sql)

--或使用isnull()

DECLARE @sql VARCHAR(8000)

--获得课程集合

SELECT @sql= ISNULL(@sql+',','')+课程 FROM tb
GROUP BY 课程           

SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

exec(@sql)

二丶实战

行转列

 

DECLARE @sql VARCHAR(8000)
SET @sql=''  --初始化变量 @sql
SELECT @sql= @sql+',' + '['+Admission_Grade+']' FROM #temp WHERE Admission_Grade>YEAR(GETDATE())-3 GROUP BY Admission_Grade ORDER BY Admission_Grade DESC--变量多值赋值
SET @sql= STUFF(@sql,1,1,'')--去掉首个','

SET @sql='select * from #temp pivot (max(studentCount) for Admission_Grade in ('+@sql+'))a'
PRINT @sql
exec(@sql)

2.

DECLARE @sql VARCHAR(8000)
SET @sql=''  --初始化变量 @sql
SELECT @sql= @sql+',' + '['+Admission_Grade+']' FROM #temp WHERE Admission_Grade>YEAR(GETDATE())-3 GROUP BY Admission_Grade ORDER BY Admission_Grade DESC--变量多值赋值
SET @sql= STUFF(@sql,1,1,'')--去掉首个','
SET @sql = ' select m.* , n.stuCount from
(select  * from (select * from #temp) a pivot (max(studentCount) for Admission_Grade in (' + @sql
    + ')) b) m,
(select Magor_Code,StudyMode,StudyHierarchy,sum(studentCount) as stuCount from #temp WHERE  Admission_Grade>YEAR(GETDATE())-3  group by Magor_Code,StudyMode,StudyHierarchy) n
where m.Magor_Code= n.Magor_Code AND m.StudyMode=n.StudyMode AND m.StudyHierarchy=n.StudyHierarchy
'
PRINT @sql
exec(@sql)

 

转载于:https://www.cnblogs.com/chenze-Index/p/10454742.html

### SQL Server 实现行转列 示例教程 在SQL Server中,行转列可以通过`PIVOT`操作符来实现。此操作符允许聚合多个行的数据并将其换成单个行中的不同列[^1]。 #### 创建示例表与数据填充 为了展示行转列的过程,先创建一个名为`Scores`的表格,并向其内插入一些学生成绩记录: ```sql IF OBJECT_ID('Scores', 'U') IS NOT NULL DROP TABLE Scores; CREATE TABLE Scores ( StudentName NVARCHAR(50), Subject NVARCHAR(50), Score INT ); INSERT INTO Scores (StudentName, Subject, Score) VALUES ('Alice', 'Math', 90), ('Alice', 'Chinese', 85), ('Bob', 'Math', 78), ('Bob', 'Chinese', 88); ``` #### 使用 PIVOT 进行列行 下面是一个具体的例子,它展示了如何利用`PIVOT`将学生的各科成绩由多行表示的形式化为每门科目作为单独的一列表现形式: ```sql SELECT * FROM ( SELECT StudentName, Subject, Score FROM Scores ) AS SourceTable PIVOT( MAX(Score) FOR Subject IN ([Math], [Chinese]) ) AS PivotTable; ``` 这段查询语句的结果将会把原始的成绩记录按照学生分组,并且对于每一个学生来说,数学(Math)和语文(Chinese)两门课的成绩会被放置在同一行的不同列里显示出来[^2]。 上述代码片段通过指定`MAX()`聚集函数处理可能存在的重复项;当每个组合键(StudentName 和 Subject)唯一时,也可以使用其他类型的聚集函数如`SUM()`, `AVG()`等依据具体需求而定[^3]。 注意,在实际应用环境中,如果不知道所有的列名或者这些列的数量可能会变化,则需要构建动态SQL语句来进行更灵活的操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值