行列互转_整理贴[转]

简介:  --行列互转/*********************************************************************************************************************...
  -- 行列互转
/*
*****************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂

整理人:中国风(Roy)

日期:2008.06.06
*****************************************************************************************************************************************************
*/

-- 1、行互列
--
> --> (Roy)生成測試數據

if not object_id ( ' Class ' ) is null
   
drop table Class
Go
Create table Class( [ Student ] nvarchar ( 2 ), [ Course ] nvarchar ( 2 ), [ Score ] int )
Insert Class
select N ' 张三 ' ,N ' 语文 ' , 78 union all
select N ' 张三 ' ,N ' 数学 ' , 87 union all
select N ' 张三 ' ,N ' 英语 ' , 82 union all
select N ' 张三 ' ,N ' 物理 ' , 90 union all
select N ' 李四 ' ,N ' 语文 ' , 65 union all
select N ' 李四 ' ,N ' 数学 ' , 77 union all
select N ' 李四 ' ,N ' 英语 ' , 65 union all
select N ' 李四 ' ,N ' 物理 ' , 85
Go
-- 2000方法:
动态:

declare @s nvarchar ( 4000 )
set @s = ''
Select      @s = @s + ' , ' + quotename ( [ Course ] ) + ' =max(case when [Course]= ' + quotename ( [ Course ] , '''' ) + ' then [Score] else 0 end) '
from Class group by [ Course ]
exec ( ' select [Student] ' + @s + ' from Class group by [Student] ' )


生成静态:

select
   
[ Student ] ,
   
[ 数学 ] = max ( case when [ Course ] = ' 数学 ' then [ Score ] else 0 end ),
   
[ 物理 ] = max ( case when [ Course ] = ' 物理 ' then [ Score ] else 0 end ),
   
[ 英语 ] = max ( case when [ Course ] = ' 英语 ' then [ Score ] else 0 end ),
   
[ 语文 ] = max ( case when [ Course ] = ' 语文 ' then [ Score ] else 0 end )
from
    Class
group by [ Student ]

GO
动态:

declare @s nvarchar ( 4000 )
Select      @s = isnull ( @s + ' , ' , '' ) + quotename ( [ Course ] ) from Class group by [ Course ]
exec ( ' select * from Class pivot (max([Score]) for [Course] in( ' + @s + ' ))b ' )

生成静态:
select *
from
    Class
pivot
    (
max ( [ Score ] ) for [ Course ] in ( [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] ))b

生成格式:
/*
Student 数学          物理          英语          语文
------- ----------- ----------- ----------- -----------
李四      77          85          65          65
张三      87          90          82          78

(2 行受影响)
*/

-- ----------------------------------------------------------------------------------------
go
-- 加上总成绩(学科平均分)

-- 2000方法:
动态:

declare @s nvarchar ( 4000 )
set @s = ''
Select      @s = @s + ' , ' + quotename ( [ Course ] ) + ' =max(case when [Course]= ' + quotename ( [ Course ] , '''' ) + ' then [Score] else 0 end) '
from Class group by [ Course ]
exec ( ' select [Student] ' + @s + ' ,[总成绩]=sum([Score])  from Class group by [Student] ' ) -- 加多一列(学科平均分用avg([Score]))

生成动态:

select
   
[ Student ] ,
   
[ 数学 ] = max ( case when [ Course ] = ' 数学 ' then [ Score ] else 0 end ),
   
[ 物理 ] = max ( case when [ Course ] = ' 物理 ' then [ Score ] else 0 end ),
   
[ 英语 ] = max ( case when [ Course ] = ' 英语 ' then [ Score ] else 0 end ),
   
[ 语文 ] = max ( case when [ Course ] = ' 语文 ' then [ Score ] else 0 end ),
   
[ 总成绩 ] = sum ( [ Score ] ) -- 加多一列(学科平均分用avg([Score]))
from
    Class
group by [ Student ]

go

-- 2005方法:

动态:

declare @s nvarchar ( 4000 )
Select      @s = isnull ( @s + ' , ' , '' ) + quotename ( [ Course ] ) from Class group by [ Course ] -- isnull(@s+',','') 去掉字符串@s中第一个逗号
exec ( ' select [Student], ' + @s + ' ,[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a
pivot (max([Score]) for [Course] in(
' + @s + ' ))b ' )

生成静态:

select
   
[ Student ] , [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] , [ 总成绩 ]
from
    (
select * , [ 总成绩 ] = sum ( [ Score ] ) over (partition by [ Student ] ) from Class) a -- 平均分时用avg([Score])
pivot
    (
max ( [ Score ] ) for [ Course ] in ( [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] ))b

生成格式:

/*
Student 数学          物理          英语          语文          总成绩
------- ----------- ----------- ----------- ----------- -----------
李四      77          85          65          65          292
张三      87          90          82          78          337

(2 行受影响)
*/

go

-- 2、列转行
--
> --> (Roy)生成測試數據

if not object_id ( ' Class ' ) is null
   
drop table Class
Go
Create table Class( [ Student ] nvarchar ( 2 ), [ 数学 ] int , [ 物理 ] int , [ 英语 ] int , [ 语文 ] int )
Insert Class
select N ' 李四 ' , 77 , 85 , 65 , 65 union all
select N ' 张三 ' , 87 , 90 , 82 , 78
Go

-- 2000:

动态:

declare @s nvarchar ( 4000 )
select @s = isnull ( @s + ' union all ' , '' ) + ' select [Student],[Course]= ' + quotename (Name, '''' ) -- isnull(@s+' union all ','') 去掉字符串@s中第一个union all
+ ' ,[Score]= ' + quotename (Name) + ' from Class '
from syscolumns where ID = object_id ( ' Class ' ) and Name not in ( ' Student ' ) -- 排除不转换的列
order by Colid
exec ( ' select * from ( ' + @s + ' )t order by [Student],[Course] ' ) -- 增加一个排序

生成静态:
select *
from ( select [ Student ] , [ Course ] = ' 数学 ' , [ Score ] = [ 数学 ] from Class union all
select [ Student ] , [ Course ] = ' 物理 ' , [ Score ] = [ 物理 ] from Class union all
select [ Student ] , [ Course ] = ' 英语 ' , [ Score ] = [ 英语 ] from Class union all
select [ Student ] , [ Course ] = ' 语文 ' , [ Score ] = [ 语文 ] from Class)t
order by [ Student ] , [ Course ]

go
-- 2005:

动态:

declare @s nvarchar ( 4000 )
select @s = isnull ( @s + ' , ' , '' ) + quotename (Name)
from syscolumns where ID = object_id ( ' Class ' ) and Name not in ( ' Student ' )
order by Colid
exec ( ' select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in( ' + @s + ' ))b ' )

go
select
    Student,
[ Course ] , [ Score ]
from
    Class
unpivot
    (
[ Score ] for [ Course ] in ( [ 数学 ] , [ 物理 ] , [ 英语 ] , [ 语文 ] ))b

生成格式:
/*
Student Course Score
------- ------- -----------
李四      数学      77
李四      物理      85
李四      英语      65
李四      语文      65
张三      数学      87
张三      物理      90
张三      英语      82
张三      语文      78

(8 行受影响)
*/
目录
相关文章
如何将Markdown文章轻松地搬运到微信公众号并完美地呈现代码内容
相信有很多童鞋跟我一样,热衷于用Markdown来编写文章。由于其简单的语法和清晰的渲染效果,受到广大码农朋友们的推崇。但是,当我们想维护起自己的公众号时,公众号编辑器往往让我们费劲了脑汁。本人尝试了各种工具,比如:秀米一些在线提供多种不同样式的编辑器。虽然这些编辑器都能够完成编辑任务,但是效果并不理想。与我们所追求的简洁、清晰风格总是格格不入,尤其是对于代码的展示非常的不友好。所以,这里给大家推荐一个本站的在线工具,可以帮助大家快速地把Markdown文章转换成微信公众号支持的漂亮格式。
369 0
如何将Markdown文章轻松地搬运到微信公众号并完美地呈现代码内容
|
7月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.2、图片截取(数组截取)
OpenCV这么简单为啥不学——1.2、图片截取(数组截取)
47 0
|
人工智能 API 数据安全/隐私保护
Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。
Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。
103 0
|
前端开发
前端学习笔记202305学习笔记第二十二天-表格数据转换
前端学习笔记202305学习笔记第二十二天-表格数据转换
49 0
|
API C语言 Windows
节空白区添加自己的代码【滴水逆向44笔记】
节空白区添加自己的代码【滴水逆向44笔记】
Markdown 文件转化为 PDF,这可能是我能想到比较好的方法了!
Markdown 文件转化为 PDF,这可能是我能想到比较好的方法了!
390 0
Markdown 文件转化为 PDF,这可能是我能想到比较好的方法了!
|
前端开发 JavaScript
前端工作总结231-读懂每行代码
前端工作总结231-读懂每行代码
87 0
前端工作总结231-读懂每行代码
|
Java 程序员 Linux
Python仅用3行代码就能输出花式字符串图集,同事直呼666!
相信Java程序员看到上面的图,一定不会陌生。没错,springboot的启动日志。不知道其他人怎么想,我第一次看到这个启动日志的时候,就觉得好炫酷。然而,大家在日常的Python开发中,日志打印的却枯燥无比。今天就来教大家打印出让同事羡慕,却让领导崩溃的代码输出。
418 0
|
Python
Python基础题型实战03-通过切片确定Excel表格中某范围的单元格数量
台上一分钟,台下十年功。从来没有懒洋洋的自由,有的是通过努力拥有更广阔的未来。 每个看到该文章的大家也是一样的;不要只看眼前利益,多注重长期利益。每天的坚持乘于365都是巨大的力量。每个行业都是精英,每个专业都是都有专才,重要的你是否足够努力,足够坚持。