`
huahongluo
  • 浏览: 37709 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

sql 行列互换

阅读更多
构造数据

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)


静态方式
SELECT 姓名, max(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 END) AS 语文, 
      max(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 END) AS 数学, 
      max(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 END) AS 物理,
      cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
FROM tb
group by 姓名


动态方式
declare @sql varchar(8000)

set @sql = 'select 姓名 '

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

from (select distinct 课程 from tb) as a

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

exec(@sql)


--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b


--SQL SERVER 2005 动态SQL。

declare @sql varchar(8000)

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

set @sql = '[' + @sql + ']'

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



问题:如果上述两表互相换一下:即表结构和数据为:

姓名 语文 数学 物理

张三 74  83  93

李四 74  84  94

想变成(得到如下结果):

姓名 课程 分数

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

李四 语文 74

李四 数学 84

李四 物理 94

张三 语文 74

张三 数学 83

张三 物理 93

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

*/

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

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

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

go

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

--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! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列

order by colid asc

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

--SQL SERVER 2005 动态SQL。

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

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL
分享到:
评论

相关推荐

    sql行列互换

    ### SQL 行列互换详解 在日常的数据处理与分析工作中,我们经常需要对数据进行各种转换以满足特定的需求或优化查询效率。其中,“行列互换”是一种常见的数据操作方式,尤其是在统计分析或数据报告中非常有用。接...

    sql行列互换常用代码

    sql行列互换常用代码,包括SQL Server2000的版本和SQL Server2005版本。

    sql表数据行列互换

    ### SQL表数据行列互换详解 在数据库管理与数据分析领域,有时我们需要对表格中的数据进行特殊的处理,例如将行转换为列或将列转换为行,这样的操作被称为“行列互换”。这种需求通常出现在汇总报告、数据透视等...

    SQL之行列互变问题

    2. **PIVOT 操作**:如果使用的是支持 PIVOT 的数据库系统(如 SQL Server),那么可以利用 PIVOT 函数来实现行列互换。 #### 四、CASE WHEN + GROUP BY 方法详解 在这个案例中,我们可以使用`CASE WHEN`语句结合`...

    SQL 实现报表的行列互换

    SQL 实现行列互换。例题,可以仿照写自己的SQL语句!注意语法

    sql经典 oracle的查询结果的行列互换

    ### Oracle SQL 中的行列互换技术详解 #### 一、引言 在处理数据库查询时,我们经常会遇到需要对查询结果进行格式调整的情况,其中一种常见的需求就是将数据的行列进行互换。例如,原始数据可能按列的形式存储了...

    SQL语句实现对数据库查询结果的行列互换

    当我们要进行行列互换时,通常涉及到的是将某一列的值转换为行,或者将多行数据合并为一列。以下是一些常见的方法: 1. **使用UNION ALL操作符** 如果你希望将多行数据合并成一列,可以使用UNION ALL。假设我们有...

    sql数据 见行列互换

    根据提供的信息来看,这篇文章主要涉及的是SQL中的行转列(Pivot)操作。在数据库管理中,有时我们需要将数据从一种格式转换成另一种格式来更好地分析或展示数据。特别是当原始数据以行的形式存在,而我们需要按列...

    orcale数据库 行列互换

    总结,Oracle数据库中的行列互换主要通过CASE、DECODE以及PIVOT等SQL语句来实现,这些方法可以根据实际需求灵活运用,使得数据以更直观的形式展现。在处理复杂的数据分析任务时,了解并熟练掌握这些技巧是非常重要的...

    行列互换sql

    行列互换,可以轻松实现sql server下数据库数据行列互换。

    行列互换.txt

    本文档提供了一个sql server中行列互换的实例sql语句。

    SQL行列转换

    在实际的数据分析和报表制作过程中,我们经常需要将数据的列与行进行互换,这就是所谓的“SQL行列转换”。这种操作在处理汇总数据、创建透视表或者进行特定统计分析时尤其常见。以下我们将详细探讨SQL中的行列转换...

    不定长的select交叉表查询,而且不用游标 sql 行列转化

    ### 不定长的SELECT交叉表查询,且不用游标:SQL行列转换技术解析 #### 一、背景介绍 在数据库管理中,数据的组织形式多种多样,有时我们需要将原本存储为行的数据转换成列的形式展示,反之亦然。这种转换在实际...

    Oracle行列转换

    通过下载提供的`Oracle补充内容_行列转换.sql`文件,你可以看到具体的SQL示例和实际操作,这将帮助你更好地理解和掌握Oracle的行列转换技巧。在实践中,理解并熟练运用这些技术,将有助于你更有效地处理和展示数据,...

    sqlserver2005 行列转换实现方法

    代码如下:–Create Company Table Create Table Company ( ComID varchar(50) primary key, ComName nvarchar(50) not null, ComNumber varchar(50) not null, ComAddress nvarchar(200), ComTele varchar(50) ) –...

    经典SQL脚本大全

    │ 行列互换的复杂交叉表.sql │ 限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 ...

    Sqlserver2000经典脚本

    复杂交叉表1.sql │ 多栏显示.sql │ 日期+星期+时间.sql │ 格式化报表.sql │ 横转竖-1.sql │ 横转竖-字段名.sql │ 横转竖-生成字段名.sql │ 横转竖.sql │ 行列互换的复杂...

    Oracle高级sql学习与练习

    6、DECODE函数和行列互换 7、CASE表达式 8、ROWNUM-TOP-N分析 9、相关子查询和非相关子查询 10、增强GROUP BY 11、分析函数(ANALYTICAL FUNCTIONS) 12、ROWID的使用 13、ORACLE 10G正则表达式 14、使用HINT 15、...

    Sql实现行列转换方便了我们存储数据和呈现数据

    在SQL中,行列转换是一种非常实用的技术,它允许我们根据需求灵活地在表格数据的行与列之间切换,极大地优化了数据的存储和展示。在本篇内容中,我们将聚焦于`pivot`和`unpivot`这两个关键字,它们是SQL Server 2005...

    SQL 通过行动态生成列

    在SQL查询中,将行数据转换为列,也称为行转列或行列互换,是数据分析和报表制作中常见的需求。这种操作对于呈现表格数据,尤其是处理统计汇总时非常有用。"SQL 通过行动态生成列"这个主题,就是探讨如何在SQL中实现...

Global site tag (gtag.js) - Google Analytics