Sql 行轉換爲列 以及列轉換爲行的心得



這是 建立數據庫的腳本文件sql

CREATE TABLE [dbo].[stu](
	[學號] [nvarchar](255) NOT NULL,
	[姓名] [nvarchar](255) NULL,
	[性別] [nvarchar](255) NULL,
	[專業] [nvarchar](255) NULL,
	[院系] [nvarchar](255) NULL
) ON [PRIMARY]

GO
INSERT [dbo].[stu] ([學號], [姓名], [性別], [專業], [院系]) VALUES (N'111405060432', N'王小明', N'男', N'金融系', N'經濟學院')
INSERT [dbo].[stu] ([學號], [姓名], [性別], [專業], [院系]) VALUES (N'07102060215', N'王碩問', N'男', N'材料成型及控制工程', N'材料科學與工程學院')
INSERT [dbo].[stu] ([學號], [姓名], [性別], [專業], [院系]) VALUES (N'07104060407', N'馮靜', N'女', N'金融學', N'經濟學院')
INSERT [dbo].[stu] ([學號], [姓名], [性別], [專業], [院系]) VALUES (N'07108040122', N'王新哲', N'男', N'環境工程', N'化工與製藥學院')
INSERT [dbo].[stu] ([學號], [姓名], [性別], [專業], [院系]) VALUES (N'07110020114', N'劉龍', N'男', N'應用物理學', N'物理與工程學院')

  


--------行值轉爲列值  使用Case語句    方法一
SELECT  學號
    ,Max(CASE 專業 WHEN '金融系' THEN  院系 else 院系  END) AS '金融系'
    ,Max(CASE 專業 WHEN '材料成型及控制工程' THEN 院系  else 院系  END) AS '材料成型及控制工程'
    ,Max(CASE 專業 WHEN '金融學' THEN 院系  else 院系  END) AS '金融學'
    ,Max(CASE 專業 WHEN '環境工程' THEN 院系  else 院系  END) AS '環境工程'
    ,Max(CASE 專業 WHEN '應用物理學' THEN 院系 else 院系  END) AS '應用物理學'
FROM
    stu
GROUP BY 學號
go

------行轉換列值   ------    方法二
declare @sql varchar(8000)

select @sql=isnull(@sql+',','')+' max(case 專業 when '''+專業+''' then 院系 else 院系  end) ['+專業+']'

from(select distinct 專業 from stu)as a      

set @sql='select 學號 ,'+@sql+' from stu group by 學號'

exec(@sql)
go

 -----使用isnull()-----
declare @sql varchar(8000)

select @sql=isnull(@sql+',','')+ 專業 from stu  group by 專業           

set @sql='select * from stu pivot (max(院系) for 專業 in ('+@sql+'))a'

exec(@sql)
go

----------使用pivot --------

select * -----要選取的列, * 表明選擇所有 from stu -------從哪一個結果集中選出數據 pivot( max(院系) --聚合函數Max表示你須要怎樣處理轉換後的列的值,是總和(sum),仍是平均(avg)仍是min,max等等。 for 專業 ---- for 專業 就是說將 專業 列的值分別轉換成一個個列,也就是「以值變列」。 in -------咱們只想取其中幾個值轉換成列,那麼怎樣取呢?就是在in裏面寫要取的值 (材料科學與工程學院,經濟學院,化工與製藥學院,物理與工程學院,金融學))--- as b go -----------列轉行 --------------------- -----使用SQL Server 2005動態SQL declare @sql nvarchar(4000) select @sql=isnull(@sql+',','')+quotename(Name) from syscolumns where ID=object_id('stu')and Name not in('姓名','學號','專業','性別') order by Colid set @sql='select 學號,姓名,[專業],性別 from stu unpivot ([aa] for [bb] in('+@sql+'))b' exec(@sql) go
------方法二------------
select * from ( select 學號,姓名,性別,專業='金融系',院系='經濟學院' from stu union all select 學號,姓名,性別,專業='材料成型及控制工程',院系='材料科學與工程學院' from stu union all select 學號,姓名,性別,專業='金融學',院系='經濟學院' from stu ) t order by 學號 go
----------使用 unpivot----------
select aa,bb from stu unpivot (aa for bb in([院系],[專業])) t

 ---------列轉行-----數據庫

--------行轉列------函數

相關文章
相關標籤/搜索