pivot  行转列

unpivot  列转行

源码跑步起来 这是能跑起来的

源码转自 http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html

create table tb(姓名 varchar(10),课程 varchar(10),分数 int)

insert into tb values('张三','语文',74)

insert into tb values('张三','数学',83)

insert into tb values('张三','物理',93)

insert into tb values('李四','语文',74)

insert into tb values('李四','数学',84)

insert into tb values('李四','物理',94)

go

select*from tb

go

select 姓名,

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 姓名

declare @sql varchar(max)

set @sql='select 姓名'

select @sql=@sql+',max( case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'

from(select distinct 课程 from tb)a--同from tb group by课程,默认按课程名排序

set @sql=@sql+' from tb group by 姓名'

exec(@sql)

------
declare @sql varchar(max)

select @sql=isnull(@sql+',','')+' max(case 课程 when '''+课程+''' then 分数 else 0 end) ['+课程+']'

from(select distinct 课程 from tb)asa

set @sql='select 姓名,'+@sql+' from tb group by 姓名'

exec(@sql)
------

select * from tb pivot(max(分数) for 课程 in( 语文,数学,物理))a

---5

declare @sql varchar(8000)

set @sql='' --初始化变量@sql

select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值

set @sql=stuff(@sql,1,1,'')--去掉首个','

set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'

exec(@sql)

--或使用isnull()

declare @sql varchar(8000)

--获得课程集合

select @sql=isnull(@sql+',','')+课程 from tb group by 课程

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 分数 else 0 end)语文,

max(case 课程 when '数学' then 分数 else 0 end)数学,

max(case 课程 when '物理' then 分数 else 0 end)物理,

sum(分数) 总分,

cast(avg(分数*1.0)as decimal(18,2))平均分

from tb

group by 姓名

姓名 语文 数学 物理 总分 平均分

---------- ----------- ----------- ----------- -----------

李四 74 84 94 252 84.00

张三 74 83 93 250 83.33

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL

declare @sql varchar(8000)

set @sql='select 姓名'

select @sql=@sql+',max(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'

from(select distinct 课程 from tb) a

set @sql=@sql+',sum(分数)总分,cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名'

exec(@sql)

3、使用SQL Server 2005静态SQL

select m.*,n.总分,n.平均分

from

(select* from tb pivot(max(分数) for 课程 in(语文,数学,物理))a)m,

(select 姓名,sum(分数)总分,cast(avg(分数*1.0)as decimal(18,2))平均分

from tb

group by 姓名)n

where m.姓名=n.姓名

4、使用SQL Server 2005动态SQL

--使用stuff()

--

declare @sql varchar(8000)

set @sql='' --初始化变量@sql

select @sql=@sql+','+课程 from tb group by 课程--变量多值赋值

--同select @sql = @sql + ','+课程from (select distinct课程from tb)a

set @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 姓名) n

where m.姓名= n.姓名'

exec(@sql)

--或使用isnull()

declare @sql varchar(8000)

select @sql=isnull(@sql +',','')+ 课程 from tb group by 课程

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 姓名) n

where m.姓名= n.姓名'

exec(@sql)

二、列转行

1、建立表格

if object_id('tb')is not null drop table tb

go

create table tb(姓名 varchar(10),语文 int,数学 int,物理 int)

insert into tb values('张三',74,83,93)

insert into tb values('李四',74,84,94)

go

select*from tb

go

姓名 语文 数学 物理

---------- ----------- ----------- -----------

张三 74 83 93

李四 74 84 94

2、使用SQL Server 2000静态SQL

--SQL SERVER 2000静态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

姓名 课程 分数

---------- ---- -----------

李四 语文 74

李四 数学 84

李四 物理 94

张三 语文 74

张三 数学 83

张三 物理 93

2、使用SQL Server 2000动态SQL

--SQL SERVER 2000动态SQL。

--调用系统表动态生态。

declare @sql varchar(8000)

select @sql=isnull(@sql+' union all ','')+' select 姓名, [课程]='

+quotename(Name,'''')+' , [分数] = '+quotename(Name)+' from tb'

from syscolumns

where Name!='姓名'and ID=object_id('tb')--表名tb,不包含列名为姓名的其他列

order by colid

exec(@sql+' order by 姓名')

go

3、使用SQL Server 2005静态SQL

--SQL SERVER 2005动态SQL

select 姓名,课程,分数 from tb unpivot (分数 for 课程 in([语文],[数学],[物理])) t

4、使用SQL Server 2005动态SQL

--SQL SERVER 2005动态SQL

declare @sql nvarchar(4000)

select @sql=isnull(@sql+',','')+quotename(Name)

from syscolumns

where ID=object_id('tb')and Name not in('姓名')

order by Colid

set @sql='select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in('+@sql+'))b'

exec(@sql)

sql:pivot unpivot的更多相关文章

  1. sql server pivot/unpivot 行列互转

    有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20 ...

  2. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  3. sql server 行转列 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot 本文转自:张志涛 原文地址: http://www.cnblogs.com/zhangzt/archive/2010/07/29/17878 ...

  4. SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  5. SQL Server中行列转换 Pivot UnPivot

    PIVOT用于将列值旋转为列名(即行转列),在SQLServer 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列)FOR 列 in (-) )AS P 完 ...

  6. 综合练习: PIVOT、UNPIVOT、GROUPING SETS、GROUPING_ID_1

    综合练习: PIVOT.UNPIVOT.GROUPING SETS.GROUPING_ID 问题1:Desired output: empid cnt2007 cnt2008 cnt2009 ---- ...

  7. [转]Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行

    原文地址:http://blog.csdn.net/seandba/article/details/72730657 函数PIVOT.UNPIVOT转置函数实现行转列.列转行,效果如下图所示: 1.P ...

  8. sql学习~pivot和unpivot用法

    pivot  可以把列值转换为输出中的多个列. pivot 可以在其他剩余的列的值上执行聚合函数. unpivot 将列转换为列值 语法 SELECT <non-pivoted column&g ...

  9. SQL中PIVOT 行列转换

    来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...

随机推荐

  1. Kali Linux Web 渗透测试视频教程—第十课 w3af

    Kali Linux Web 渗透测试视频教程—第十课 w3af 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/24/kali-linux-web- ...

  2. SQL SERVER 数据库查询表和字段信息语句

    --数据库中所有表的信息(很强悍的)    SELECT    表名               =   CASE   WHEN   A.COLORDER=1   THEN   D.NAME   EL ...

  3. C++ WIN32控制台异常关闭回调函数

    /* This is an example of the SetConsoleCtrlHandler function that is used to install a control handle ...

  4. [芯片] 3、接口技术·实验三·可编程并行接口8255A

    目录 一.实验目的和要求 二.实验原理与背景 2-1.8255A简介 2-2.8255A编程 三.实验具体的内容 3-1.8255方式0实验1 3-2.8255方式0实验2 3-3.8255方式1输出 ...

  5. Gatling->次时代性能测试利器

    Gatling作为一款开源免费的性能测试工具越来越受到广大程序员的欢迎.免费当然是好的,最缺钱的就是程序员了;开源更好啊,缺啥功能.想做定制化的可以自己动手,丰衣足食.其实我最喜欢的原因是其提供了简洁 ...

  6. 汇编语言hello world

    DOS下: ;栈段 stack segment stack db dup(?) stack ends ;数据段 data segment szHello db 'Hello,world',0dh,0a ...

  7. 【原】关于使用jieba分词+PyInstaller进行打包时出现的一些问题的解决方法

    错误现象: 最近在做一个小项目,在Python中使用了jieba分词,感觉非常简洁方便.在Python端进行调试的时候没有任何问题,使用PyInstaller打包成exe文件后,就会报错: 错误原因分 ...

  8. webpack学习之入门实例

    webpack:前端打包神器,目前活跃度甚至超过了gulp.grunt等,使用webpack打包,简单快速,下面记录下webpack环境搭建以及基本使用: 1.首先新建一个空白目录,用于项目根目录,比 ...

  9. Leetcode 172 Factorial Trailing Zeroes

    给定一个数n 求出n!的末尾0的个数. n!的末尾0产生的原因其实是n! = x * 10^m 如果能将n!是2和5相乘,那么只要统计n!约数5的个数. class Solution { public ...

  10. 详解Bootstrap缩略图组件及警示框组件

    缩略图组件 缩略图在网站中最常用的就是产品列表页面,一行显示几张图片,有的在图片底下带有标题.描述内容.按钮等信息.bootstrap框架将这部分独立成一个模块组件,通过类名.thumbnail配合b ...