- --一行多列转一行
- --构建临时表
- create table #temp(id int,dataType int,val int,price decimal(10,2));
- --插入数据
- insert into #temp(id,dataType,val,price)
- select 1,1,100,20.5
- union all
- select 1,2,200,30.6
- union all
- select 1,3,300,40.7
- --查询数据
- select id,dataType,val,price
- from #temp;
- --将一列多行转换成一行
- select id,value,valueType+CONVERT(varchar(1),dataType) valueType
- from (select id,dataType,convert(decimal(10,2),val) val,convert(decimal(10,2),price) cd
- --注意:要转换的列要保持类型一致,不然会报错
- from #temp
- ) x
- unpivot (value for valueType in (val,cd)) y
- --将多行转换成多列
- select id,val1,cd1,val2,cd2,val3,cd3
- from (select id,value,valueType+CONVERT(varchar(1),dataType) valueType --注意:不同类型列拼接,注意转换
- from (select id,dataType,convert(decimal(10,2),val) val,convert(decimal(10,2),price) cd
- --注意:要转换的列要保持类型一致,不然会报错
- from #temp
- ) x
- unpivot (value for valueType in (val,cd)) y --注意:如果in()中为数字,用中括号([])括起来。例如:in ([001],[002],[003])
- --SO问题来了:怎样调用字段?
- --调用字段时,同样采用[001],[002],[003]字段,SQLServer中会把中括号([])解析掉
- --如果比较列标题是否一致时,比如:[001]标题解析为:001,它是否于正常的001一样呢?
- --答案:不一样。建议给这些特殊字段标题起个别名
- ) m
- pivot (max(value) for valueType in (val1,cd1,val2,cd2,val3,cd3)) n;
sqlserver行列转换 文1
最新推荐文章于 2023-08-21 22:00:16 发布