位置: 编程技术 - 正文

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两个数据怎么合并到一起)

  • 所得税申报表的营业成本包括费用吗
  • 消费税是指什么税
  • 价外费用含税吗
  • 企业所得税季度预缴
  • 社保工伤保险可以交两家公司吗
  • 市场营销策划开题报告
  • 利润为负数利润增长率怎么算
  • 航天金税的服务费如何抵扣
  • 重型开输机属于固定资产什么类别
  • 销售补差怎么做分析
  • 税务管理中的非税是指
  • 企业的党员活动有哪些
  • 企业清算所得税申报表清算期间
  • 非货币性资产交换准则
  • 完税凭证和发票一起打印
  • 建筑面积包括分摊建筑面积吗
  • 买了两个可以退一个吗
  • 企业临时用工付出会计处理
  • 进出口货物买卖合同
  • 城镇土地使用税减免税政策
  • 乐器的税率
  • 差额征税条件
  • 年度汇算清缴可以作废吗
  • 固定资产抵扣进项
  • 确认收入后又退部分款怎么做账
  • 增值税的附加税有哪些,税费多少
  • 季度申报利润表怎么填
  • 高新补贴是什么意思
  • 跨省经营如何缴纳流转税?
  • 企业注销所得税汇算清缴
  • 修改远程桌面端
  • 现金流量表怎么编制
  • 如何计算劳务费个人所得税
  • php b/s
  • 出租车车票可以出卖吗
  • phpstudy备份数据库
  • 财政补贴的内容分类
  • 分公司与总公司不在一个城市如何起诉
  • 结转本月完工产品成本120000元
  • php框架零基础入门
  • pytorch开源项目
  • 网络命令traceroute
  • 营改增之后还有营业税金及附加吗
  • 个体户一直未申请怎么办
  • 免税收入货款要交税吗
  • 购进货物用于建筑安装
  • 查定征收在哪一章
  • 非公司员工机票能报销吗
  • 可抵扣的税票
  • 接受捐赠后怎么发表感言
  • 商贸企业涉税问题
  • 企业发放职工薪酬的账务处理
  • etc发票当天可以打印吗
  • 技术服务费发票样本
  • mysql导出查询结果sql
  • freebsd书籍
  • 驱动安装过程中发生错误
  • 新买的读卡器不读卡,提示放入驱动盘
  • spyagent4.exe - spyagent4是什么进程
  • mac系统教程
  • 如何关闭自动启动项目
  • unity加载gif
  • opengl做简单的模型
  • iphone一直让登陆icloud
  • javascript 浏览器
  • dos用处
  • Unity3D游戏开发标准教程
  • uiview继承哪个类
  • sku分析的作用
  • opengl visual studio
  • 原生js制作日历软件
  • linux修改目录路径
  • css选择器怎么写
  • angularjs2
  • c语言 ls
  • shell脚本实现文件移动、复制等操作
  • python连接mysql实例分享
  • jQuery轻松实现表格的隔行变色和点击行变色的实例代码
  • 股东向公司借款合法吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设