SQL行转列汇总PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P完整语法:table_sourcePIVOT(聚合函数(value_column)FOR pivot_columnIN(<column_list>))UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现完整语法:table_sourceUNPIVOT(value_columnFOR pivot_columnIN(<column_list>))注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别在数据库属性->选项->兼容级别改为   90典型实例一、行转列1、建立表格ifobject_id('tb')isnotnulldroptabletbgocreatetabletb(姓名varchar(10),课程varchar(10),分数int)insertintotbvalues('张三','语文',74)insertintotbvalues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语文',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)goselect*fromtbgo姓名       课程       分数---------- ---------- -----------

张三       语文        74张三       数学        83张三       物理        93李四       语文        74李四       数学        84李四       物理        942、使用SQL Server 2000静态SQL--c

select姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理fromtbgroupby姓名姓名       语文        数学        物理---------- ----------- ----------- -----------

李四        74          84          94张三        74          83          933、使用SQL Server 2000动态SQL--SQL SERVER 2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)--变量按sql语言顺序赋值declare@sqlvarchar(500)set@sql='select姓名'select@sql=@sql+',max(case课程when '''+课程+''' then分数else 0 end)['+课程+']'from(selectdistinct课程fromtb)a--同from tb group by课程,默认按课程名排序set@sql=@sql+' from tb group by姓名'exec(@sql)--使用isnull(),变量先确定动态部分declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+' max(case课程when '''+课程+''' then分数else 0 end) ['+课程+']'from(selectdistinct课程fromtb)asa      set@sql='select姓名,'+@sql+' from tb group by姓名'exec(@sql)姓名       数学        物理        语文---------- ----------- ----------- -----------

李四        84          94          74张三        83          93          744、使用SQL Server 2005静态SQLselect*fromtb pivot(max(分数)for课程in(语文,数学,物理))a5、使用SQL Server 2005动态SQL--使用stuff()declare@sqlvarchar(8000)set@sql=''  --初始化变量@sqlselect@sql=@sql+','+课程fromtbgroupby课程--变量多值赋值set@sql=stuff(@sql,1,1,'')--去掉首个','set@sql='select * from tb pivot (max(分数) for课程in ('+@sql+'))a'exec(@sql)--或使用isnull()declare@sqlvarchar(8000)–-获得课程集合select@sql=isnull(@sql+',','')+课程fromtbgroupby课程           set@sql='select * from tb pivot (max(分数) for课程in ('+@sql+'))a'exec(@sql)二、行转列结果加上总分、平均分1、使用SQL Server 2000静态SQL--SQL SERVER 2000静态SQL

select姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理,sum(分数)总分,cast(avg(分数*1.0)asdecimal(18,2))平均分fromtbgroupby姓名姓名       语文        数学        物理        总分        平均分---------- ----------- ----------- ----------- -----------

李四        74          84          94          252         84.00张三        74          83          93          250         83.332、使用SQL Server 2000动态SQL--SQL SERVER 2000动态SQLdeclare@sqlvarchar(500)set@sql='select姓名'select@sql=@sql+',max(case课程when '''+课程+''' then分数else 0 end)['+课程+']'from(selectdistinct课程fromtb)aset@sql=@sql+',sum(分数)总分,cast(avg(分数*1.0) as decimal(18,2))      平均分from tb group by姓名'exec(@sql)3、使用SQL Server 2005静态SQLselectm.*,n.总分,n.平均分from(select*fromtb pivot(max(分数)for课程in(语文,数学,物理))a)m,(select姓名,sum(分数)总分,cast(avg(分数*1.0)asdecimal(18,2))平均分fromtbgroupby姓名)nwherem.姓名=n.姓名4、使用SQL Server 2005动态SQL--使用stuff()--

declare@sqlvarchar(8000)set@sql=''  --初始化变量@sqlselect@sql=@sql+','+课程fromtbgroupby课程--变量多值赋值--同select @sql = @sql + ','+课程from (select distinct课程from tb)aset@sql=stuff(@sql,1,1,'')--去掉首个','set@sql='select m.* , n.总分,n.平均分from(select * from (select * from tb) a pivot (max(分数) for课程in ('+@sql+')) b) m ,(select姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分from tb group by姓名) nwhere m.姓名= n.姓名'exec(@sql)--或使用isnull()declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+课程fromtbgroupby课程set@sql='select m.* , n.总分,n.平均分from(select * from (select * from tb) a pivot (max(分数) for课程in ('+@sql+')) b) m ,(select姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2))平均分from tb group by姓名) nwhere m.姓名= n.姓名'exec(@sql)二、列转行1、建立表格ifobject_id('tb')isnotnulldroptabletbgocreatetabletb(姓名varchar(10),语文int,数学int,物理int)insertintotbvalues('张三',74,83,93)insertintotbvalues('李四',74,84,94)goselect*fromtbgo姓名       语文        数学        物理---------- ----------- ----------- -----------

张三       74          83          93李四        74          84          942、使用SQL Server 2000静态SQL--SQL SERVER 2000静态SQL。select*from(select姓名,课程='语文',分数=语文fromtbunionallselect姓名,课程='数学',分数=数学fromtbunionallselect姓名,课程='物理',分数=物理fromtb) torderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3end姓名       课程 分数---------- ---- -----------

李四       语文 74李四       数学 84李四       物理 94张三       语文 74张三       数学 83张三       物理 932、使用SQL Server 2000动态SQL--SQL SERVER 2000动态SQL。--调用系统表动态生态。declare@sqlvarchar(8000)select@sql=isnull(@sql+' union all ','')+' select姓名, [课程]='+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'fromsyscolumnswhereName!='姓名'andID=object_id('tb')--表名tb,不包含列名为姓名的其他列

orderbycolidexec(@sql+' order by姓名')go3、使用SQL Server 2005静态SQL--SQL SERVER 2005动态SQL

select姓名,课程,分数fromtb unpivot (分数for课程in([语文],[数学],[物理])) t4、使用SQL Server 2005动态SQL--SQL SERVER 2005动态SQLdeclare@sqlnvarchar(4000)select@sql=isnull(@sql+',','')+quotename(Name)fromsyscolumnswhereID=object_id('tb')andNamenotin('姓名')orderbyColidset@sql='select姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'exec(@sql)

转载于:https://www.cnblogs.com/wzq806341010/p/3785795.html

Sql 语句收集——行转列相关推荐

  1. SQL 语句集合(行转列,参数化...)

    1.查找表中行总数以及去重行数 SELECT COUNT (*) AS '总行数' ,(SELECT COUNT(*) FROM ( SELECT DISTINCT(字段) FROM table)a) ...

  2. sql语句实现行转列的3种方法

    前言 一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理. CREATE TABLE TestTable([ ...

  3. SQL语句实现行转列

    最近在维护一个项目,出现了一下bug需要进行调试,于是把正式库上面的代码搬到本地库上面,数据库是本地的,跑项目的时候调试发现代码里面带有wmsys.wm_concat函数的SQL语句出现错误,经排查发 ...

  4. 征集佳句-精妙SQL语句收集

    征集佳句-精妙SQL语句收集 SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留 ...

  5. sql语句收集_老杨风子_新浪博客

    sql语句收集 1. wm_concat函数也来打擂台 使用场景:简单的将一列的字段通过逗号连接起来. Example: select a1,(wm_concat(b1),from aa group ...

  6. 一条SQL语句完成对一列关键词的匹配

    一条SQL语句完成对一列关键词的匹配 先放重点! 核心语句: select * from 表1 t1 join 表2 t2 on t1.待匹配字段 like concat( '%', t2.关键词列, ...

  7. serverl列求和 sql_分组后分组合计以及总计SQL语句--收集未整理

    分组后分组合计以及总计SQL语句 1)想一次性得到分组合计以及总计,sql: SELECT分组字段FROM表 GROUP BY分组字段 compute sum(COUNT(*)) ===== 2)分组 ...

  8. SQL SERVER特殊行转列案列一则

    今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) ...

  9. 精妙SQL语句收集(转)

    SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作. 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 ...

最新文章

  1. 图的算法专题——最小生成树
  2. 资深程序员感叹:表妹成绩好却无奈辍学开理发店,月入6万,上大学没用!网友:那是你没用!...
  3. 只需 4 步,自己搞个 Spring Boot Starter!
  4. OS- -文件系统(三)
  5. xfce右键open in terminal失效问题解决
  6. 重新审视自己和自己的目标
  7. git 命令详解_再次学习Git版本控制工具
  8. linux中shell数组的使用和建立
  9. 学生管理系统IPO图_基于BIM技术的医院建筑运维管理系统构建
  10. 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
  11. 微软OpenPai平台部署安装(kubernetes 大数据和深度学习平台安装部署)
  12. LabVIEW如何减少下一代测试系统中的硬件过时6
  13. drawArc 画扇形 画弧线
  14. 嵌入式linux开发笔记——Ubuntu的使用
  15. 在云计算行业内有什么证书比较有名?受市场认可大?
  16. PostgreSQL在Linux和Windows安装和入门基础教程
  17. Java NIO 底层原理详解
  18. (FLANN论文)fast approximate nearest neighbors with automatic algorithm configuration——中英对照翻译
  19. SpringBoot工程接入腾讯云短信服务平台
  20. JS 实现一个倒计时

热门文章

  1. HTML单元格怎么加单元格,如何根据其值在HTML单元格中添加类
  2. c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf
  3. python求pai的近似值_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现
  4. php 缺少 wordpress,Wordpress localhost安装错误 - 您的PHP安装似乎缺少WordPress所需的MySQL扩展程序...
  5. java mp4 视频时间戳_MP4文件中音视频时间戳的计算
  6. python中uniform(a、b)_关于uniform的详细介绍
  7. 一段javascript告警回放代码
  8. 如何得到juniper的pe ip device_name filter name等
  9. Node.js 极简笔记
  10. Linux 的cp命令