`

【转】DB2、SQL Server 中纵表转横表(行列转换)示例

 
阅读更多
普通行列转换
假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文  74
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94
*/

-------------------------------------------------------------------------
/*
想变成
姓名         语文        数学        物理         
---------- ----------- ----------- -----------
李四         74          84          94
张三         74          83          93
*/


create table tb
(
   Name    varchar(10) ,
   Subject varchar(10) ,
   Result  int
)

insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go


--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理
from tb
group by name

/*
姓名         语文        数学        物理         
---------- ----------- ----------- -----------
李四         74          84          94
张三         74          83          93
*/


--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql) 

/*
姓名         数学        物理        语文         
---------- ----------- ----------- -----------
李四         84          94          74
张三         83          93          74
*/

-------------------------------------------------------------------
/*加个平均分,总分
姓名         语文        数学        物理        平均分          总分         
---------- ----------- ----------- ----------- -------------------- -----------
李四         74         84        94        84.00         252
张三         74         83        93        83.33         250
*/


--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
  max(case subject when '语文' then result else 0 end) 语文,
  max(case subject when '数学' then result else 0 end) 数学,
  max(case subject when '物理' then result else 0 end) 物理,
  cast(avg(result*1.0) as decimal(18,2)) 平均分,
  sum(result) 总分
from tb
group by name

/*
姓名         语文        数学        物理        平均分         总分         
---------- ----------- ----------- ----------- -------------------- -----------
李四         74         84        94        84.00        252
张三         74         83        93        83.33        250
*/

--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1) 

/*
姓名         数学        物理        语文        平均分             总分         
---------- ----------- ----------- ----------- -------------------- -----------
李四         84         94        74        84.00           252
张三         83         93        74        83.33           250
*/

drop table tb   

---------------------------------------------------------
---------------------------------------------------------
/*
如果上述两表互相换一下:即

姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94

想变成
Name       Subject Result     
---------- ------- -----------
李四         语文      74
李四         数学      84
李四         物理      94
张三         语文      74
张三         数学      83
张三         物理      93
*/


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

insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)

select * from
(
  select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
  union all
  select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
  union all
  select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end


--------------------------------------------------------------------
/*加个平均分,总分
Name       Subject     Result              
---------- -------    --------------------
李四         语文      74.00
李四         数学      84.00
李四         物理      94.00
李四         平均分    84.00
李四         总分      252.00
张三         语文      74.00
张三         数学      83.00
张三         物理      93.00
张三         平均分    83.33
张三         总分      250.00
*/

select * from
(
  select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
  union all
  select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
  union all
  select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
  union all
  select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
  union all
  select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb1
分享到:
评论

相关推荐

    SQL Server纵表与横表相互转换的方法

    本文将详细介绍如何在SQL Server中进行纵表与横表的相互转换,并提供具体的SQL语句示例。 1. **纵表转横表(Pivot)** 纵表通常拥有大量的行,而列的数量相对较少。在纵表中,每个特定的属性可能分布在多行中。...

    mysql数据库转换成SQLserver数据库

    2. **结构映射**:由于MySQL和SQL Server的语法和特性有所不同,转换过程中需要对表结构进行映射。例如,MySQL的ENUM类型在SQL Server中可能需要转化为CHAR或VARCHAR,MySQL的TINYINT可能对应SQL Server的BIT。此外...

    mysql数据库转换成SQLserver工具包

    1. 数据库结构转换:工具首先分析MySQL的表结构,包括字段名、字段类型、键约束(主键、外键等)、索引等,然后在SQL Server中创建相应的表结构。 2. 数据迁移:将MySQL中的记录逐条读取并写入到SQL Server中,确保...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    数据库转换工具,可实现oracle,mysql,sqlserver,sybase,db2相互转换

    数据库转换工具,可实现oracle,mysql,sqlserver,sybase,db2相互转换

    oracle db2 sql server

    标题“Oracle、DB2、SQL Server”提示我们讨论的是三个主要的关系型数据库管理系统(RDBMS):Oracle、IBM DB2以及Microsoft SQL Server。这些数据库系统在IT领域中广泛用于数据存储、管理和处理,尤其在企业级应用...

    db2sqlserver.zip

    本文将以“db2sqlserver.zip”这个压缩包为例,详细讲解如何使用Python和相关工具,将SQLite数据库中的数据导入到SQL Server中,并在此过程中涉及到的关键知识点。 SQLite是一种轻量级、无服务器的嵌入式关系型...

    DB2 SQLSERVER 的SQL规范化

    这是我的培训文档,我总结的很详细了,有sqlserver 也有db2 的,包括很多内容。对应搞BI或者语句开发的很有帮助。

    DB2数据库和SQL Server数据库jdbc连接示例

    在这个示例中,我们关注的是两种主流的数据库管理系统(DBMS)——IBM的DB2和Microsoft的SQL Server,以及它们如何通过Java Database Connectivity(JDBC)接口与Java应用程序进行交互。下面我们将深入探讨DB2和SQL ...

    sqlServer数据库大表分区方案

    ### SQL Server 大表分区方案详解 #### 一、大表分区条件 在数据库管理过程中,随着业务数据的不断增长,单个表的数据量可能会变得非常庞大,这不仅会导致数据库性能下降,还会影响数据处理效率。为了有效解决这些...

    SQL_Server,Oracle,DB2数据库SQL语句比较

    标题与描述均聚焦于SQL Server, Oracle, 和DB2数据库中的SQL语句比较,这是一个对IT专业人士特别是数据库管理员(DBA)、开发人员以及对数据库技术感兴趣的人来说极为实用的主题。以下是对给定文件中提及的关键知识点...

    DB2 SQL性能调优秘笈

    ### DB2 SQL性能调优秘笈 在数据库领域,IBM DB2因其稳定性和高效性而备受推崇,尤其是在大型企业级应用中。对于DB2数据库管理员(DBA)来说,掌握有效的SQL性能调优技巧至关重要。这不仅能提升系统的响应速度,还...

    比较SQL Server、Oracle和DB2

    在数据库管理领域,SQL Server、Oracle和DB2是三大主流的关系型数据库管理系统(RDBMS),它们各自拥有独特的特性和优势。以下是对这三个数据库系统的详细比较: 1. SQL Server(微软公司产品): - **易用性**:...

    SQLServer与DB2迁移中的主要差别及解决办法

    标题和描述均聚焦于SQL Server与DB2数据库迁移过程中遇到的主要差异及解决方案,这是一个在IT领域内常见且复杂的任务,尤其是在企业级应用中。数据库迁移不仅仅是数据的简单转移,更涉及到了解源数据库与目标数据库...

    常见数据库db2,sqlserver,Oracle比较

    ### 常见数据库db2,sqlserver,Oracle比较 #### 开放性 - **SQL Server**:只能在Windows平台上运行,这意味着对于操作系统的选择极为有限。由于Windows平台本身的设计更偏向于桌面应用,如Windows 9X系列,它们...

    ACCESS\SQL Server数据库转换MYSQL数据库工具

    无论是ACCESS还是SQL Server,都使用SQL进行数据操作,而转换工具DB2MYSQL则负责将Access中的SQL语法转换为MySQL所接受的SQL语法。 在压缩包子文件的文件名称列表中: - "db2mysql.exe" 是主应用程序文件,用户通过...

    SQL SERVER自动导出Word数据库文档

    3. **Transact-SQL与OPENROWSET函数**:在SQL Server中,可以通过Transact-SQL查询数据,并使用OPENROWSET函数将结果集转换为文本或XML格式,然后利用外部程序(如Word)进行处理。例如,可以使用BULK INSERT或...

    DB2数据库SQL注入手册1

    在本手册中,我们将介绍如何在DB2数据库中进行SQL注入攻击的检测和防止。同时,我们还将提供一些实用的SQL语句,用于检测和防止SQL注入攻击。 检测SQL注入 在DB2数据库中,可以使用以下方法来检测SQL注入: 1. ...

Global site tag (gtag.js) - Google Analytics