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 学号 ,‘[email protected]+‘ 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 (‘[email protected]+‘))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(‘[email protected]+‘))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

Sql 行转换为列 以及列转换为行的心得,布布扣,bubuko.com

时间: 2024-09-30 15:32:44

Sql 行转换为列 以及列转换为行的心得的相关文章

SQL SERVER特殊行转列案列一则

原文:SQL SERVER特殊行转列案列一则 今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) INSERT INTO TEST SELECT 1,    1,    '定型名称',    '预定型'           UNION ALL SELECT 1,    2,    '进布方式',    '调平'             UNION 

做图表统计你需要掌握SQL Server 行转列和列转行

说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例

SQL 查询数据后行数据合并为列

SQL 将查询后得到的多行数据中的某一列转为一列,如原查找后的结果为: USER_NAME 张三 李四 王五 现要将其合并为: CUSTOMER 张三,李四,王五 SQL语句如下:select STUFF((select ','+USER_NAME from tbale where USER_NAME = '' for xml path('')), 1, 1, '') CUSTOMER 其中,stuff为sql封装好的一个方法函数,用于删除指定长度的字符并在指定的起始点插入另一组字符. 语法:S

SQL 行转列和列转行

行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和总结过.为了加深认识,再总结一次. 行列互转,可以分为静态互转,即事先就知道要处理多少行(列);动态互转,事先不知道处理多少行(列). --创建测试环境 USE tempdb; GO IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orde

重温SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列 CREATE TAB

SQL——行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清晰,而且比较习惯. 但是PIVOT .UNPIVOT提供的语法比一系列复杂的SELECT...CASE 语句中所指定的语法更简单.更具可读性.下面我们通过几个简单的例子来介绍一下列转行.行转列问题. 我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列 CREATE TAB

sql 行转列 PIVOT 列转行 UNPIVOT

原文:sql 行转列 PIVOT 列转行 UNPIVOT 一: 现有表一(t_table1),想转为表二(t_table2)的格式. 表一: 年 公司 收入 2013 公司1 12 2013 公司2 22 2013 公司3 32 2012 公司1 42 2012 公司2 52 2012 公司3 62 表二: 年 公司1 公司2 公司3 2012 42 52 62 2013 12 22 32 可使用sql2005之后提供的PIVOT 具体操作如下: select * from   t_table1

sql内置函数pivot强大的行转列功能

原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 200

sql中的行转列和列转行的问题

sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题  简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) GO INSERT INTO #T VALUES(1,2,3) GO SELECT * FROM #T --行转列:(union all) SELECT MON1 FROM #T UNION ALL SELECT MON2 FROM #T UNION ALL SELECT MON3 FROM #T G