位置: 编程技术 - 正文

sql 普通行列转换

编辑:rootadmin
问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 想变成(得到如下结果): 姓名 语文 数学 物理 ---- ---- ---- ---- 李四 张三 ------------------- */ create table tb(姓名 varchar() , 课程 varchar() , 分数 int) insert into tb values('张三' , '语文' , ) insert into tb values('张三' , '数学' , ) insert into tb values('张三' , '物理' , ) insert into tb values('李四' , '语文' , ) insert into tb values('李四' , '数学' , ) insert into tb values('李四' , '物理' , ) go --SQL SERVER 静态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 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同) declare @sql varchar() 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 静态SQL。 select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b --SQL SERVER 动态SQL。 declare @sql varchar() select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程 set @sql = '[' + @sql + ']' exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') --------------------------------- /* 问题:在上述结果的基础上加平均分,总分,得到如下结果: 姓名 语文 数学 物理 平均分 总分 ---- ---- ---- ---- ------ ---- 李四 . 张三 . */ --SQL SERVER 静态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(,2)) 平均分, sum(分数) 总分 from tb group by 姓名 --SQL SERVER 动态SQL。 declare @sql varchar() 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(,2)) 平均分 , sum(分数) 总分 from tb group by 姓名' exec(@sql) --SQL SERVER 静态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(,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n where m.姓名 = n.姓名 --SQL SERVER 动态SQL。 declare @sql varchar() 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(,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n where m.姓名 = n.姓名') drop table tb ------------------ ------------------ /* 问题:如果上述两表互相换一下:即表结构和数据为: 姓名 语文 数学 物理 张三      李四      想变成(得到如下结果): 姓名 课程 分数 ---- ---- ---- 李四 语文 李四 数学 李四 物理 张三 语文 张三 数学 张三 物理 -------------- */ create table tb(姓名 varchar() , 语文 int , 数学 int , 物理 int) insert into tb values('张三',,,) insert into tb values('李四',,,) go --SQL SERVER 静态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 动态SQL。 --调用系统表动态生态。 declare @sql varchar() 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 动态SQL。 select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t --SQL SERVER 动态SQL,同SQL SERVER 动态SQL。 -------------------- /* 问题:在上述的结果上加个平均分,总分,得到如下结果: 姓名 课程 分数 ---- ------ ------ 李四 语文 . 李四 数学 . 李四 物理 . 李四 平均分 . 李四 总分 . 张三 语文 . 张三 数学 . 张三 物理 . 张三 平均分 . 张三 总分 . ------------------ */ 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(,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

推荐整理分享sql 普通行列转换,希望有所帮助,仅作参考,欢迎阅读内容。

sql 普通行列转换

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

mssql 两种数据插入方式 --常用的方式insertintojobs(job_desc,min_lvl,max_lvl)values('SQL语句插入数据A',,)insertintojobs(job_desc,min_lvl,max_lvl)values('SQL语句插入数据B',,)insertintojobs(job_desc,min

mssql @@ERROR 使用 mssql错误日志文件存放位置:C:ProgramFilesMicrosoftSQLServerMSSQLLOG用记事本查看@@ERROR返回一个整数0为正常sysmessages存放的错误信息系统表(master)USEmasterselect*

sqlserver 数据库日志备份和恢复步骤 --创建测试数据库CREATEDATABASEDbGO--对数据库进行备份BACKUPDATABASEDbTODISK='c:db.bak'WITHFORMATGO--创建测试表CREATETABLEDb.dbo.TB_test(IDint)--延时1秒钟,再进行后面的操

标签: sql 普通行列转换

本文链接地址:https://www.jiuchutong.com/biancheng/349067.html 转载请保留说明!

上一篇:SQL Server的复制功能(sql server复制数据库的方法)

下一篇:mssql 两种数据插入方式(sql两个数据怎么合并到一起)

  • 土地取得方式有哪些
  • 外地预缴所得税的会计分录
  • 一般纳税人增值税会计账务处理
  • 增值税怎么记
  • 火车票丢了怎么补打报销凭证
  • 公司没有收入怎么报销
  • 建筑企业结转成本怎么算
  • 进口小汽车消费税组成计税价格
  • 变更财务负责人在网上变更流程
  • 2017企业所得税小微企业优惠政策
  • 购进商品用于样品赠送的账务处理
  • 企业的养老金根据什么扣除
  • 分公司的款汇入总公司得出什么证明
  • 怎么查企业的增值税纳税额
  • 社保支付账号是什么
  • 出租柜台收取的服务费
  • 固定资产转移是什么意思
  • 华为鸿蒙系统怎么降级版本
  • 金税盘减免税款怎么结转
  • 财务软件单机版下载免费
  • win10系统怎么设置
  • win7有线连接怎么设置
  • php面向对象是什么意思
  • 成品油企业自用油需要开具发票吗
  • PHP:curl_close()的用法_cURL函数
  • PHP:pg_transaction_status()的用法_PostgreSQL函数
  • 股票收益的计算公式
  • 企业职工福利费的扣除标准是多少?
  • php编程基础与实例教程
  • 财政返还土地奖金的规定
  • php面向对象的三大特征
  • 来料加工企业需注意什么
  • 接受股权投资账务处理
  • 外贸行业税率
  • 危废处理账务处理
  • js去掉数组中的空字符串
  • 深度学习分析NASA电池数据(1 数据读取)
  • lua命令库
  • php删除数据
  • 纳税检查企业所得税企业合并
  • 吸收合并的目的是什么
  • 公章盖错在旁边加盖正确的说明
  • 销售价格低于成本价,税务机关是否有权纳税调整?
  • 织梦cms为什么不维护了
  • 公司收到股权转让款需要交什么税种
  • mysql命令行如何命令行导出查询结果并导入
  • 零申报一定要有员工吗
  • 工程施工和工程结算的账务处理
  • 差旅费跨年报销违反什么规定
  • sql server复制表数据
  • 陈列费计入什么科目
  • 小微企业员工人数限制
  • 劳务派遣的公司值得去吗
  • 销售款退回会计分录
  • 哪些账户期末结账后一定无余额
  • 生产成本福利费如何分摊
  • 交通运输业包含
  • 电子发票必须要打印出来才能作为入账依据
  • 日记账的设置和登记
  • win7的运行命令在哪里
  • 华尔街日报体
  • 下列哪种情况能使血管升压素释放增加
  • 众微科技怎么样
  • 正确安全管理操作手册
  • windows xp远程控制
  • host文件内容
  • hpp是什么文件
  • win7电脑音量
  • win8windows设置在哪里
  • win10系统故障恢复
  • Win10预览版镜像
  • win10开机多了一个账户怎么删除
  • [置顶]马粥街残酷史
  • 英特尔在哪打开
  • 网上申报纳税小程序下载
  • 江苏电子税务局客服电话
  • 合伙企业可以融资吗
  • 小微企业印花税税率
  • 国办函和国办发
  • 国家税务总局上海税务局(个人)
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设