pivot行轉列與unpivot列轉行

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

相關文章
相關標籤/搜索