普通行列转换
假设有张学生成绩表(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语句示例。 1. **纵表转横表(Pivot)** 纵表通常拥有大量的行,而列的数量相对较少。在纵表中,每个特定的属性可能分布在多行中。...
2. **结构映射**:由于MySQL和SQL Server的语法和特性有所不同,转换过程中需要对表结构进行映射。例如,MySQL的ENUM类型在SQL Server中可能需要转化为CHAR或VARCHAR,MySQL的TINYINT可能对应SQL Server的BIT。此外...
1. 数据库结构转换:工具首先分析MySQL的表结构,包括字段名、字段类型、键约束(主键、外键等)、索引等,然后在SQL Server中创建相应的表结构。 2. 数据迁移:将MySQL中的记录逐条读取并写入到SQL Server中,确保...
DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列
数据库转换工具,可实现oracle,mysql,sqlserver,sybase,db2相互转换
标题“Oracle、DB2、SQL Server”提示我们讨论的是三个主要的关系型数据库管理系统(RDBMS):Oracle、IBM DB2以及Microsoft SQL Server。这些数据库系统在IT领域中广泛用于数据存储、管理和处理,尤其在企业级应用...
本文将以“db2sqlserver.zip”这个压缩包为例,详细讲解如何使用Python和相关工具,将SQLite数据库中的数据导入到SQL Server中,并在此过程中涉及到的关键知识点。 SQLite是一种轻量级、无服务器的嵌入式关系型...
这是我的培训文档,我总结的很详细了,有sqlserver 也有db2 的,包括很多内容。对应搞BI或者语句开发的很有帮助。
在这个示例中,我们关注的是两种主流的数据库管理系统(DBMS)——IBM的DB2和Microsoft的SQL Server,以及它们如何通过Java Database Connectivity(JDBC)接口与Java应用程序进行交互。下面我们将深入探讨DB2和SQL ...
### SQL Server 大表分区方案详解 #### 一、大表分区条件 在数据库管理过程中,随着业务数据的不断增长,单个表的数据量可能会变得非常庞大,这不仅会导致数据库性能下降,还会影响数据处理效率。为了有效解决这些...
标题与描述均聚焦于SQL Server, Oracle, 和DB2数据库中的SQL语句比较,这是一个对IT专业人士特别是数据库管理员(DBA)、开发人员以及对数据库技术感兴趣的人来说极为实用的主题。以下是对给定文件中提及的关键知识点...
### DB2 SQL性能调优秘笈 在数据库领域,IBM DB2因其稳定性和高效性而备受推崇,尤其是在大型企业级应用中。对于DB2数据库管理员(DBA)来说,掌握有效的SQL性能调优技巧至关重要。这不仅能提升系统的响应速度,还...
在数据库管理领域,SQL Server、Oracle和DB2是三大主流的关系型数据库管理系统(RDBMS),它们各自拥有独特的特性和优势。以下是对这三个数据库系统的详细比较: 1. SQL Server(微软公司产品): - **易用性**:...
标题和描述均聚焦于SQL Server与DB2数据库迁移过程中遇到的主要差异及解决方案,这是一个在IT领域内常见且复杂的任务,尤其是在企业级应用中。数据库迁移不仅仅是数据的简单转移,更涉及到了解源数据库与目标数据库...
### 常见数据库db2,sqlserver,Oracle比较 #### 开放性 - **SQL Server**:只能在Windows平台上运行,这意味着对于操作系统的选择极为有限。由于Windows平台本身的设计更偏向于桌面应用,如Windows 9X系列,它们...
无论是ACCESS还是SQL Server,都使用SQL进行数据操作,而转换工具DB2MYSQL则负责将Access中的SQL语法转换为MySQL所接受的SQL语法。 在压缩包子文件的文件名称列表中: - "db2mysql.exe" 是主应用程序文件,用户通过...
3. **Transact-SQL与OPENROWSET函数**:在SQL Server中,可以通过Transact-SQL查询数据,并使用OPENROWSET函数将结果集转换为文本或XML格式,然后利用外部程序(如Word)进行处理。例如,可以使用BULK INSERT或...
在本手册中,我们将介绍如何在DB2数据库中进行SQL注入攻击的检测和防止。同时,我们还将提供一些实用的SQL语句,用于检测和防止SQL注入攻击。 检测SQL注入 在DB2数据库中,可以使用以下方法来检测SQL注入: 1. ...