位置: 编程技术 - 正文

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

  • 个体工商户增值税怎么计算
  • 往来票据如何开具
  • 环评费用怎么入账
  • 小规模开专票附加税要计提吗
  • 先开发票后发货
  • 债权投资减值的账务处理
  • 非正常损失免税吗
  • 司法拍卖定义
  • 税控发票包括哪些
  • 周转材料核算科目是什么
  • 房地产企业开发成本科目明细
  • 公司分期付款买车可以抵税吗
  • 行政单位的会计要素
  • 转出未交增值税怎么算
  • 小微企业季度超过30万怎么报增值税
  • 减税降费各项政策
  • 7月1日发票新规定
  • 跨年度错账更正方法
  • 即征即退进项税额分摊方法
  • 汇算清缴时交的税怎么算
  • 小规模库存商品结转成本太低怎么办
  • 滴滴电子发票怎么填写
  • 公司开13个点增值税交多少钱
  • 纳税评估要转出什么意思
  • 企业固定资产报废申请报告
  • flash动画导出视频有水印吗
  • windows10如何关闭病毒和威胁防护设置
  • 什么时候不能计入开办费
  • 车辆哪些费用计税
  • 如何实现php图片打印
  • 以前年度应付账款做到制造费用如何改账
  • 广告费和业务宣传费15%还是30%
  • 安全生产责任险保障范围
  • 小规模纳税人多久缴纳一次增值税
  • php数组函数 菜鸟
  • 企业退货产生的损失谁承担
  • 金融行业如何征收营业税
  • 企业季度所得税怎么算
  • linux安装cuda的正确姿势
  • 电力系统培训计划
  • 出售子公司股权不丧失控制权
  • 银行存款利息应记什么科目
  • 酒店会计科目及账务处理视频
  • 土石方工程开票范围
  • 企业实缴各类税金的总额
  • 织梦网站特有标识
  • 营业总收入同比增长怎么分析
  • 财务管理税后利息费用都包含什么
  • 来料加工成本是多少
  • 年底没有取得发票企业所得税
  • 为员工保险取得的增值税抵扣
  • 贷款减值准备如何计算
  • 生产成本如何做核算
  • 预付账款转营业外支出
  • 农产品加计扣除怎么计算
  • 存货有哪几个科目
  • 上年度计提多了的奖金怎么办
  • 增值税销项抵扣报税后有效期是多长时间
  • 企业差旅费的报销流程
  • 广告宣传费纳税调整额怎么算
  • 高新技术企业退出机制
  • 企业初建
  • mysql 存储过程存放在哪里
  • 硬盘安装在哪里
  • u盘界面可以设置背景吗
  • ftp的安装
  • windows xp桌面图标
  • linux 如何查看
  • linux如何查看用户的信息
  • 设置全局
  • ugui scrollview
  • es6字符串模版
  • 批处理常用命令
  • JavaScript cookie 跨域访问之广告推广
  • javascript相对路径
  • vue中使用js
  • 安卓自动登录应用程序
  • 关闭计算机盖的功能
  • 让你略表情包
  • 金三是什么鱼竿?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设