Sql 语句收集——行转列
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 语句收集——行转列相关推荐
- SQL 语句集合(行转列,参数化...)
1.查找表中行总数以及去重行数 SELECT COUNT (*) AS '总行数' ,(SELECT COUNT(*) FROM ( SELECT DISTINCT(字段) FROM table)a) ...
- sql语句实现行转列的3种方法
前言 一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理. CREATE TABLE TestTable([ ...
- SQL语句实现行转列
最近在维护一个项目,出现了一下bug需要进行调试,于是把正式库上面的代码搬到本地库上面,数据库是本地的,跑项目的时候调试发现代码里面带有wmsys.wm_concat函数的SQL语句出现错误,经排查发 ...
- 征集佳句-精妙SQL语句收集
征集佳句-精妙SQL语句收集 SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留 ...
- sql语句收集_老杨风子_新浪博客
sql语句收集 1. wm_concat函数也来打擂台 使用场景:简单的将一列的字段通过逗号连接起来. Example: select a1,(wm_concat(b1),from aa group ...
- 一条SQL语句完成对一列关键词的匹配
一条SQL语句完成对一列关键词的匹配 先放重点! 核心语句: select * from 表1 t1 join 表2 t2 on t1.待匹配字段 like concat( '%', t2.关键词列, ...
- serverl列求和 sql_分组后分组合计以及总计SQL语句--收集未整理
分组后分组合计以及总计SQL语句 1)想一次性得到分组合计以及总计,sql: SELECT分组字段FROM表 GROUP BY分组字段 compute sum(COUNT(*)) ===== 2)分组 ...
- SQL SERVER特殊行转列案列一则
今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) ...
- 精妙SQL语句收集(转)
SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作. 一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 ...
最新文章
- 图的算法专题——最小生成树
- 资深程序员感叹:表妹成绩好却无奈辍学开理发店,月入6万,上大学没用!网友:那是你没用!...
- 只需 4 步,自己搞个 Spring Boot Starter!
- OS- -文件系统(三)
- xfce右键open in terminal失效问题解决
- 重新审视自己和自己的目标
- git 命令详解_再次学习Git版本控制工具
- linux中shell数组的使用和建立
- 学生管理系统IPO图_基于BIM技术的医院建筑运维管理系统构建
- 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
- 微软OpenPai平台部署安装(kubernetes 大数据和深度学习平台安装部署)
- LabVIEW如何减少下一代测试系统中的硬件过时6
- drawArc 画扇形 画弧线
- 嵌入式linux开发笔记——Ubuntu的使用
- 在云计算行业内有什么证书比较有名?受市场认可大?
- PostgreSQL在Linux和Windows安装和入门基础教程
- Java NIO 底层原理详解
- (FLANN论文)fast approximate nearest neighbors with automatic algorithm configuration——中英对照翻译
- SpringBoot工程接入腾讯云短信服务平台
- JS 实现一个倒计时
热门文章
- HTML单元格怎么加单元格,如何根据其值在HTML单元格中添加类
- c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf
- python求pai的近似值_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现
- php 缺少 wordpress,Wordpress localhost安装错误 - 您的PHP安装似乎缺少WordPress所需的MySQL扩展程序...
- java mp4 视频时间戳_MP4文件中音视频时间戳的计算
- python中uniform(a、b)_关于uniform的详细介绍
- 一段javascript告警回放代码
- 如何得到juniper的pe ip device_name filter name等
- Node.js 极简笔记
- Linux 的cp命令