1. 程式人生 > >SQLServer多行多列資料轉為一行

SQLServer多行多列資料轉為一行

--一行多列轉一行
--構建臨時表
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;