`
simlee
  • 浏览: 53639 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

行列互转--整理

阅读更多
--行列互转
/******************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂

整理人:中国风(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 行受影响)
*/
分享到:
评论

相关推荐

    SQL行转列和列转行-静态互转-动态互转

    有case when方式和2005之后的内置pivot和unpivot方法来实现,行列互转,可以分为静态互转,动态互转。

    sql 行列互转

    sql 行列互转 方便实用,对与中级使用者很有帮助,也对有这方面需求的同学参考。

    sql行列互转

    sql行列互转,存储过程中带输入和输出参数的用法,如何将exec执行结果放入变量中

    C#读写Excel表格,行列互转并输出

    本文将详细讲解如何使用C#读取Excel表格,并进行行列互转,最后将转换后的数据输出到新的Excel文件中。我们将基于Visual Studio 2012进行开发,但这些方法同样适用于其他版本的Visual Studio。 首先,你需要安装一...

    行列转换的小工具 可以进行行列互转

    行列转换的小工具 可以进行行列互转,非常好用,

    Sql行列互转

    ### SQL Server中的行列互转 #### 一、背景介绍 在处理数据时,我们经常需要对表格中的数据进行各种各样的操作,其中之一就是行列互转。比如,原始数据可能是按学生姓名和科目存储成绩,但我们需要按科目汇总所有...

    新东方线性代数笔记--第一讲_行列式--李永乐.pdf

    新东方线性代数笔记--第一讲_行列式--李永乐.pdf Resources Summary: 新东方 Linear Algebra Notes -- Lecture 1: Determinants -- Li Yongle 本资源为新东方线性代数笔记的第一讲,主要讲解行列式的概念和计算...

    kettle 行列互转、列拆分为多行、获取文件名等控件使用

    行列互转、列拆分为多行、获取文件名(通配符获取多个路径下的文本文件输入到输出) 行列互转、列拆分为多行、获取文件名(通配符获取多个路径下的文本文件输入到输出) 行列互转、列拆分为多行、获取文件名...

    行列互转工具

    行列互换工具是网络优化中常用的小工具,希望可以方便大家的使用,使用方法简单,转化速度极快。谢谢!

    数据处理Pandas-如何实现行列数据的转换-Python实例源码.zip

    本压缩包文件"数据处理Pandas-如何实现行列数据的转换-Python实例源码.zip"显然专注于介绍如何在Pandas中进行行列数据的转换,这对于数据科学家和分析师来说是一项基本且重要的技能。 首先,我们来讨论Pandas的核心...

    全市场教育行业策略报告:美联英语赴美IPO,跻身在线英语培训行列-0604-安信证券-17页.pdf

    全市场教育行业策略报告:美联英语赴美IPO,跻身在线英语培训行列-0604-安信证券-17页.pdf

    出库单-自动保存至出库数据-行列自由调整-Excel模板

    【作品名称】:出库单-自动保存至出库数据-行列自由调整-Excel模板 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    SQL2000 和 SQL2005 下 行列转换 示例 - freeliver54 - 博客园.pdf

    ### SQL2000 和 SQL2005 下行转列转换示例解析 #### 一、背景介绍 本文档提供了在SQL Server 2000和SQL Server 2005两个版本中进行行转列操作的具体示例。行转列是一种常见的数据处理方式,用于将表格中的行数据...

    矩阵的各种计算:乘法、逆矩阵、转置、行列式等-基于Excel实现

    矩阵的各种计算:乘法、逆矩阵、转置、行列式等-基于Excel实现

    多阶行列式计算-java

    本程序采用java编写,具有计算n阶行列式的功能。采用递归算法实现,将一个高阶行列式不断展开,直到变成2阶,然后计算。用输入框获取输入,单击按钮执行程序。通过本程序,可以学习递归算法、BorderLayout和...

    SQL之行列互变问题

    ### SQL之行列互变问题详解 #### 一、引言 在处理数据库中的数据时,我们经常遇到需要将数据从一种格式转换为另一种格式的需求,其中最常见的一种就是行列互换的问题。例如,原始数据是按照列的形式存储的,而我们...

    旋转(整理)

    - 旋转可以通过正交矩阵来表示,这种矩阵的行列式等于1。 - 正交矩阵确保了旋转后图形的大小和形状不变。 ##### 3.2 欧拉角与轴角表示 **欧拉角:** - 通过绕着三个坐标轴的连续旋转来实现最终的旋转效果。 - 每个...

    批量标准矢量shp互转txt工具

    标题中的“批量标准矢量shp互转txt工具”指的是一个专为处理地理信息系统(GIS)数据而设计的软件工具,主要用于将SHP文件转换成TXT格式。SHP文件是Esri公司开发的Shapefile格式,是广泛使用的矢量地理数据存储格式...

    考研计算机知识点整理-组原

    考研计算机知识点整理--组原 按章节整理的知识点,以及某些相关的应试结论 可用于知识点的筛查和补充 ...​ DRAM:地址线复用[地址线+数据线+WR+片选行列选通代替],刷新(实际就是一次存取,时间2ms

    Protues仿真实例-4x4行列键盘-51单片机

    4x4行列键盘是与51单片机交互的常见输入设备,常用于实现简单的用户输入功能。本篇文章将深入探讨如何在Protues仿真环境中实现4x4行列键盘与51单片机的交互。 首先,我们需要了解51单片机的基本结构。51系列单片机...

Global site tag (gtag.js) - Google Analytics