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

 ---------列轉行-----

--------行轉列------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM