sql 普通行列转换_MsSql

来源:脚本之家  责任编辑:小易  

select fangabh,listagg(duifbsh,'/')within group(order by fangabh desc)from tablegroup by fangabh如果是oracle的话,也可以wmsys.wm_concat,如下select fangabh,wmsys.wm_concat(duifbsh)duifbsh,count(duifbsh)as tt from tablegroup by fangabhorder by tt descwww.zgxue.com防采集请勿采集本网。

问题:假设有张学生成绩表(tb)如下:

姓名 课程 分数

咋都喜欢这样涅。数据库就是用来放数据的,至于数据如何呈现给用户显示,应该是客户端程序的事,所以建议把这个功能放在你的客户端程序里去实现。

张三 语文 74

转换成 create table htol(name varchar2(20),year varchar2(20));insert into htol values('A','2012');执行三次 insert into htol values('B','2012');执行五次 insert into htol values('A','2010');

张三 数学 83

一条语法是无法实现的,可以写一个存储过程来处理。动态生成这个月多少天就写成多少个列。create procedure xp_gongzi@sdat date,@edat date as declare@sql varchar(4000)='select users'

张三 物理 93

-mssql: with tmp(col)as (select '1111' union all select '2222' union all select '3333' union all select '4444'), tmp1(col,col_new,level)as (select col,cast(SUBSTRING(col,1,1)as

李四 语文 74

sqlserver2005中可以用 Pivot UnPivot 来实现。sqlserver2000的话,行数 和列数在数据库中是可变的,恐怕很难实现。想想存储过程+临时表吧。

李四 数学 84

李四 物理 94

想变成(得到如下结果):

姓名 语文 数学 物理

---- ---- ---- ----

李四 74 84 94

张三 74 83 93

-------------------

*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)

insert into tb values('张三' , '语文' , 74)

insert into tb values('张三' , '数学' , 83)

insert into tb values('张三' , '物理' , 93)

insert into tb values('李四' , '语文' , 74)

insert into tb values('李四' , '数学' , 84)

insert into tb values('李四' , '物理' , 94)

go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)

select 姓名 as 姓名 ,

max(case 课程 when '语文' then 分数 else 0 end) 语文,

max(case 课程 when '数学' then 分数 else 0 end) 数学,

max(case 课程 when '物理' then 分数 else 0 end) 物理

from tb

group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)

declare @sql varchar(8000)

set @sql = 'select 姓名 '

select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'

from (select distinct 课程 from tb) as a

set @sql = @sql + ' from tb group by 姓名'

exec(@sql)

--SQL SERVER 2005 静态SQL。

select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。

declare @sql varchar(8000)

select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程

set @sql = '[' + @sql + ']'

exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

---------------------------------

/*

问题:在上述结果的基础上加平均分,总分,得到如下结果:

姓名 语文 数学 物理 平均分 总分

---- ---- ---- ---- ------ ----

李四 74 84 94 84.00 252

张三 74 83 93 83.33 250

*/

--SQL SERVER 2000 静态SQL。

select 姓名 姓名,

max(case 课程 when '语文' then 分数 else 0 end) 语文,

max(case 课程 when '数学' then 分数 else 0 end) 数学,

max(case 课程 when '物理' then 分数 else 0 end) 物理,

cast(avg(分数*1.0) as decimal(18,2)) 平均分,

sum(分数) 总分

from tb

group by 姓名

--SQL SERVER 2000 动态SQL。

declare @sql varchar(8000)

set @sql = 'select 姓名 '

select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'

from (select distinct 课程 from tb) as a

set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'

exec(@sql)

--SQL SERVER 2005 静态SQL。

select m.* , n.平均分 , n.总分 from

(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,

(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n

where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。

declare @sql varchar(8000)

select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程

exec ('select m.* , n.平均分 , n.总分 from

(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,

(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n

where m.姓名 = n.姓名')

drop table tb

------------------

------------------

/*

问题:如果上述两表互相换一下:即表结构和数据为:

姓名 语文 数学 物理

张三 74  83  93

李四 74  84  94

想变成(得到如下结果):

姓名 课程 分数

咋都喜欢这样涅。数据库就是用来放数据的,至于数据如何呈现给用户显示,应该是客户端程序的事,所以建议把这个功能放在你的客户端程序里去实现。

---- ---- ----

李四 语文 74

sqlserver2005中可以用 Pivot UnPivot 来实现。sqlserver2000的话,行数 和列数在数据库中是可变的,恐怕很难实现。想想存储过程+临时表吧。

李四 数学 84

李四 物理 94

张三 语文 74

转换成 create table htol(name varchar2(20),year varchar2(20));insert into htol values('A','2012');执行三次 insert into htol values('B','2012');执行五次 insert into htol values('A','2010');

张三 数学 83

一条语法是无法实现的,可以写一个存储过程来处理。动态生成这个月多少天就写成多少个列。create procedure xp_gongzi@sdat date,@edat date as declare@sql varchar(4000)='select users'

张三 物理 93

-mssql: with tmp(col)as (select '1111' union all select '2222' union all select '3333' union all select '4444'), tmp1(col,col_new,level)as (select col,cast(SUBSTRING(col,1,1)as

--------------

*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)

insert into tb values('张三',74,83,93)

insert into tb values('李四',74,84,94)

go

--SQL SERVER 2000 静态SQL。

select * from

(

select 姓名 , 课程 = '语文' , 分数 = 语文 from tb

union all

select 姓名 , 课程 = '数学' , 分数 = 数学 from tb

union all

select 姓名 , 课程 = '物理' , 分数 = 物理 from tb

) t

order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。

--调用系统表动态生态。

declare @sql varchar(8000)

select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'

from syscolumns

where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列

order by colid asc

exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。

select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------

/*

问题:在上述的结果上加个平均分,总分,得到如下结果:

姓名 课程 分数

咋都喜欢这样涅。数据库就是用来放数据的,至于数据如何呈现给用户显示,应该是客户端程序的事,所以建议把这个功能放在你的客户端程序里去实现。

---- ------ ------

李四 语文 74.00

李四 数学 84.00

李四 物理 94.00

李四 平均分 84.00

李四 总分 252.00

张三 语文 74.00

张三 数学 83.00

张三 物理 93.00

张三 平均分 83.33

张三 总分 250.00

------------------

*/

select * from

(

select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb

union all

select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb

union all

select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb

union all

select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb

union all

select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb

) t

order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb

SELECTMAX(CASE WHEN SetupID=1 THEN SetupName ELSE NULL)AS[1],MAX(CASE WHEN SetupID=2 THEN SetupName ELSE NULL)AS[2],MAX(CASE WHEN SetupID=3 THEN SetupName ELSE NULL)AS[3],MAX(CASE WHEN SetupID=4 THEN SetupName ELSE NULL)AS[4]FROM table内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 一个简单的sql 行列转换语句
  • sqlserver2005 行列转换实现方法
  • c#中datatable实现行列转换的方法
  • 浅析sql语句行列转换的两种方法 case...when与pivot函数的应用
  • 深入sql中pivot 行列转换详解
  • sql实现行列转换方便了我们存储数据和呈现数据
  • 玩转-sql2005数据库行列转换
  • oracle实现行列转换的方法分析
  • js控制网页动态生成任意行列数表格的方法
  • 数据库实现行列转换(mysql示例)
  • truncate 快速删除表中的所有数据
  • sql server安装完成后3个需要立即修改的配置选项
  • c#连接数据库及sql2005远程连接的方法
  • sql server误区30日谈 第13天 在sql server 2000兼容模式下不能使
  • ms sql server 数据库日志压缩方法与代码
  • sqlserver实现树形结构递归查询(无限极分类)的方法
  • 根据日期知道当天是星期几的手动计算方法
  • sql数据库的高级sql注入的一些知识
  • sql注入原理简介_动力节点java学院整理
  • sql server如何利用开窗函数over()进行分组统计
  • SQL 进行行列转换
  • sql 如何实现行列转换如图
  • 行列转换,求最简单SQL方法,悬赏5分请高手指点!
  • Sql怎么实现行列转换
  • SQL语句之合并行列转换
  • SQL行列转换
  • 一个数据行列转换的问是。求SQL 语句。
  • sql行列转换
  • SQL里行列转换
  • SQL行列转换
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mssql一个简单的sql 行列转换语句sqlserver2005 行列转换实现方法c#中datatable实现行列转换的方法浅析sql语句行列转换的两种方法 case...when与pivot函数的应用深入sql中pivot 行列转换详解sql实现行列转换方便了我们存储数据和呈现数据玩转-sql2005数据库行列转换oracle实现行列转换的方法分析js控制网页动态生成任意行列数表格的方法数据库实现行列转换(mysql示例)truncate 快速删除表中的所有数据sql server安装完成后3个需要立即修改的配置选项c#连接数据库及sql2005远程连接的方法sql server误区30日谈 第13天 在sql server 2000兼容模式下不能使ms sql server 数据库日志压缩方法与代码sqlserver实现树形结构递归查询(无限极分类)的方法根据日期知道当天是星期几的手动计算方法sql数据库的高级sql注入的一些知识sql注入原理简介_动力节点java学院整理sql server如何利用开窗函数over()进行分组统计sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据sql重复记录查询的几种方法win7系统安装sqlserver2000的详细sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些vs2015安装之后加装sql server2014详细步sql表连接查询使用方法(sql多表连接查询)sql server 数据库索引其索引的小技巧sql server数据库开发的二十一条法则sql server 2016 安装步骤图文教程15个初学者必看的基础sql查询语句sql server中查看对象定义的sql语句sql server 触发器介绍sql server 2016正式版安装配置过程图文详sql server日期相减 的实现详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved