`

SQL完成交叉表功能

阅读更多

SQL完成交叉表功能

转自http://www.2cto.com/database/201111/112122.html

 

交叉表(Cross Tabulations)是一种常用的分类汇总表格。使用交叉表查询,显示源于表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部。行和列的交叉处可以对数据进行多种汇总计算,如:求和、平均值、记数、最大值、最小值等。(摘自百度百科)

交叉报表是指提取数据并将其变换成列名称,从而使数据能够以交叉部分格式进行编排的表格形式。交叉报表是报表当中常见的类型,属于基本的报表,是行、列方向都有分组的报表。这里牵涉到另外一个概念即分组报表。这是所有报表当中最普通,最常见的报表类型,也是所有报表工具都支持的一种报表格式。从一般概念上来讲,分组报表就是只有纵向的分组。传统的分组报表制作方式是把报表划分为条带状,用户根据一个数据绑定向导指定分组,汇总字段,生成标准的分组报表。(摘自智库百科)

 

假设有张学生成绩表(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语法来实现交叉表的功能,即在一个表格中,行和列的数据可以相互转换,形成类似透视的效果。 #### 知识点详解 ### 一、创建临时表并填充数据 ```sql CREATE TABLE #result ( ...

    sql交叉表中是使用

    接下来,我们需要使用交叉表功能来对这些数据进行整理和展示。具体操作如下: ```sql SELECT Աʱ״̬, ԱǼ, ڵǼ, ͳ·, ͳ·ړ, ڵǼ, (CASE WHEN տ = 1 THEN լǼʱ ELSE '0:00' END) AS '1ʱ', (CASE WHEN ...

    oracle交叉表sql

    ### Oracle交叉表SQL知识点解析 #### 一、交叉表(Pivot Table)概念与应用场景 在数据分析领域,交叉表(Pivot Table)是一种常见的数据整理技术,它将原始数据按照特定维度进行重组,使得数据从行式存储变为列式...

    SQL Server 交叉表查询 case

    在Access中,可以通过TRANSFORM语句实现交叉表查询,但在SQL Server中,我们需要使用不同的方法,比如CASE表达式配合聚合函数来实现类似的功能。 Access的TRANSFORM语句示例如下: ```sql TRANSFORM First...

    C#动态交叉表查询

    4. **SQL Server Pivot功能**:如果你的数据存储在SQL Server中,可以使用SQL的PIVOT关键字直接在数据库层面完成交叉表查询。然后在C#中只需执行这个SQL语句即可获取结果。 5. **Entity Framework**:如果你使用...

    iReport柱状图和交叉表画法

    iReport是一款广泛使用的报表设计工具,特别在Java应用程序中,能够与JasperReports库无缝...对于交叉表,则需要掌握分组设置和数据统计功能。通过本篇的介绍,读者可以快速掌握iReport中柱状图和交叉表的设计方法。

    birt 交叉表实例

    下面我们将深入探讨BIRT交叉表的使用、功能以及如何通过`sample.rptdesign`文件来实践这一功能。 一、BIRT交叉表简介 BIRT交叉表,又称透视表,是一种数据汇总工具,能够将多个列的数据按照行和列的组合进行统计和...

    JasperReport 中交叉报表指南

    在报表生成中,交叉报表是一种常用的报表类型,能够将数据按照行和列进行交叉处理,生成一个交叉表。以下是 JasperReport 中交叉报表的生成指南: 1. 设置 subDataSets 数据源 在 JasperReport 中,交叉报表需要...

    SQL2000客户端工具

    用户可以通过拖放操作创建复杂的报表,包括图表、交叉表和自定义图形,然后可以将其发布到报表服务器供其他人查看和交互。 5. **数据库比较工具**:数据库比较工具可以帮助用户比较两个数据库或数据库架构之间的...

    学生信息管理系统部分代码(带权限和交叉表)

    这里,我们主要讨论VS2008中的权限管理和交叉表两个关键功能。 1. **权限管理**:在《学生信息管理系统》中,权限管理是确保数据安全性和隐私保护的重要机制。权限系统通常由用户认证和授权两部分组成。用户认证是...

    T-SQL语法大全

    **T-SQL**(Transact-SQL)是Microsoft SQL Server使用的SQL方言,它扩展了标准SQL的功能,提供了更强大的数据管理和编程能力。T-SQL由以下几个主要部分组成: 1. **DML(数据操作语言Data Manipulation Language)**: ...

    SQL数据库查询分析器

    1. **查询编辑器**:提供了一个友好且功能丰富的文本编辑器,用户可以在这里编写SQL语句,支持自动完成和语法高亮,提高编写效率。 2. **结果查看**:执行查询后,查询分析器会以表格形式显示结果,支持排序、过滤、...

    Microsoft SQL Server 2008 Office 2007 数据挖掘外接程序

    Excel 表分析工具:此外接程序提供了一些易于使用的工具,这些工具可利用 SQL Server 2008 的数据挖掘功能对电子表格数据执行强大的分析。此版本中添加了两个新工具:预测计算器和购物篮分析。 Excel 数据挖掘...

    SQL行列转换

    2. **自连接或交叉连接**:对于没有`PIVOT`功能的数据库,可以使用自连接或交叉连接来模拟行列转换。这种方法较为复杂,但可以实现类似的效果。 三、使用Analytics函数 1. **窗口函数**:SQL的窗口函数(如`ROW_...

    sql editor在计费账务系统中的功能运用.pdf

    而SQL编辑器通过编写脚本可以显著提高效率,仅需约10分钟就能完成工作,极大地节省了时间和降低了错误率。对于具有唯一性要求的字段,如月租费率和结算计时账目类型关系,可以使用ALTER语句修改字段类型并更新临时表...

    SQL+SERVER+2008+学习笔记

    - **差异**: SQL Server 2008 引入了新的功能和改进。 - **兼容性**: 大多数T-SQL语法保持一致。 #### 十、管理数据表 ##### 2.1 数据表的基本结构 - **列**: 定义数据类型和约束。 - **主键**: 确保每条记录的...

    SQL 优化原则

    如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表...

    ORACLE 优化sql语句提高oracle执行效率 .doc

    如果有三个以上的表连接查询,那么就需要选择交叉表作为基础表。 2. WHERE 子句中的连接顺序:Oracle 采用自下而上的顺序解析 WHERE 子句。因此,表之间的连接必须写在其他 WHERE 条件之前,那些可以过滤掉最大数量...

    sqlserveR第1章_SQL_Server_数据库基础

    ### SQL Server 数据库基础知识点详解 #### 一、SQL Server 概述 - **SQL Server 定义**:SQL Server 是由微软公司开发的一款高性能的客户端/服务器...这对于后续深入学习 SQL Server 的高级功能打下了坚实的基础。

Global site tag (gtag.js) - Google Analytics