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
效果如圖:ide
--將多行轉換成多列 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;
效果如圖:函數
/* 避免轉換時數據類型報錯,建議臨時表直接都存爲varchar類型 */ create table #a(Id int identity(1,1), Bb varchar(50), Tsgs varchar(50), Zz varchar(50)) insert into #a select distinct case Bb when '00f45749-7706-47cf-b00a-bc47c5d87eb9' then '甲班' when '36d7b28f-f375-49df-907f-9f0385e3cc74' then '乙班' when '36d7b28f-f375-49df-907f-9f0385e3cc74' then '丙班' when '9745bc84-73b3-4736-8c5d-d0318d1e3708' then '丁班' end Bb, Tsgs, Zz from MES_Prcj_Jsltczjl where RsjhId = '3063864' select * from #a --將一行多列轉換爲一列 select value, valueType + convert(varchar(1),y.Id) valueType from (select Id, Bb, Tsgs, Zz from #a) x unpivot (value for valueType in (Bb, Tsgs, Zz))y --將多列多行轉換爲一行 select Bb1, Tsgs1, Zz1, Bb2, Tsgs2, Zz2 from ( select value, valueType + convert(varchar(1),y.Id) valueType from (select Id, Bb, Tsgs, Zz from #a) x unpivot (value for valueType in (Bb, Tsgs, Zz))y ) m pivot (max(value) for valueType in(Bb1, Tsgs1, Zz1, Bb2, Tsgs2, Zz2)) n
效果如圖:spa
pivot操做還能夠使用聚合操做,如sum(),avg(),max().......在for以前使用聚合函數3d
unpviot操做涉及到如下三個邏輯處理階段。code
1,生成副本blog
2,提取元素ci
3,刪除帶有NULL的行it