- 浏览: 21404 次
- 性别:
- 来自: 深圳
文章分类
最新评论
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
发表评论
-
JNDI全面总结 (tomact中配置连接池)
2012-09-24 13:09 1407转发 http://yunqiang-zhang- ... -
wabacus 学习体会一
2012-08-20 16:21 1139采用<report type ="form&q ... -
OFBiz的主要配置文件说明——ofbiz-component.xml
2012-07-18 17:45 1063OFBiz的主要配置文件说明——ofbiz-component ... -
OFBiz之Component与Application
2012-07-18 17:38 797OFBiz之Component与Application ... -
OFBiz的主要配置文件说明——component-load.xml
2012-07-18 17:25 955OFBiz的主要配置文件说明——component-lo ... -
Ofbiz基本结构
2012-07-18 17:11 959OFBiz是一个非常著名的电子商务平台,是一个 ... -
只需一条语句即可记住所有的ORACLE的系统表
2012-08-06 15:31 663转自:http://wulinhaoxia5.ite ... -
OFBIZ10.04开发环境搭建
2012-07-16 00:23 1047转自 http://www.haogongju.net/art ... -
sql语句优化
2012-07-15 23:58 685sql语句优化 总结1 选择索引 ... -
优化数据库的方法及SQL语句优化的原则
2012-07-15 23:47 693转自 硅谷动力 http://www.enet.com.cn/ ... -
SQL语句优化的原则(主要MySQL)
2012-07-15 23:44 1026转自 http://home.oncity.cc/home-s ...
相关推荐
此描述进一步明确了目标是使用标准SQL语法来实现交叉表的功能,即在一个表格中,行和列的数据可以相互转换,形成类似透视的效果。 #### 知识点详解 ### 一、创建临时表并填充数据 ```sql CREATE TABLE #result ( ...
接下来,我们需要使用交叉表功能来对这些数据进行整理和展示。具体操作如下: ```sql SELECT Աʱ״̬, ԱǼ, ڵǼ, ͳ·, ͳ·ړ, ڵǼ, (CASE WHEN տ = 1 THEN լǼʱ ELSE '0:00' END) AS '1ʱ', (CASE WHEN ...
### Oracle交叉表SQL知识点解析 #### 一、交叉表(Pivot Table)概念与应用场景 在数据分析领域,交叉表(Pivot Table)是一种常见的数据整理技术,它将原始数据按照特定维度进行重组,使得数据从行式存储变为列式...
在Access中,可以通过TRANSFORM语句实现交叉表查询,但在SQL Server中,我们需要使用不同的方法,比如CASE表达式配合聚合函数来实现类似的功能。 Access的TRANSFORM语句示例如下: ```sql TRANSFORM First...
4. **SQL Server Pivot功能**:如果你的数据存储在SQL Server中,可以使用SQL的PIVOT关键字直接在数据库层面完成交叉表查询。然后在C#中只需执行这个SQL语句即可获取结果。 5. **Entity Framework**:如果你使用...
iReport是一款广泛使用的报表设计工具,特别在Java应用程序中,能够与JasperReports库无缝...对于交叉表,则需要掌握分组设置和数据统计功能。通过本篇的介绍,读者可以快速掌握iReport中柱状图和交叉表的设计方法。
下面我们将深入探讨BIRT交叉表的使用、功能以及如何通过`sample.rptdesign`文件来实践这一功能。 一、BIRT交叉表简介 BIRT交叉表,又称透视表,是一种数据汇总工具,能够将多个列的数据按照行和列的组合进行统计和...
在报表生成中,交叉报表是一种常用的报表类型,能够将数据按照行和列进行交叉处理,生成一个交叉表。以下是 JasperReport 中交叉报表的生成指南: 1. 设置 subDataSets 数据源 在 JasperReport 中,交叉报表需要...
用户可以通过拖放操作创建复杂的报表,包括图表、交叉表和自定义图形,然后可以将其发布到报表服务器供其他人查看和交互。 5. **数据库比较工具**:数据库比较工具可以帮助用户比较两个数据库或数据库架构之间的...
这里,我们主要讨论VS2008中的权限管理和交叉表两个关键功能。 1. **权限管理**:在《学生信息管理系统》中,权限管理是确保数据安全性和隐私保护的重要机制。权限系统通常由用户认证和授权两部分组成。用户认证是...
**T-SQL**(Transact-SQL)是Microsoft SQL Server使用的SQL方言,它扩展了标准SQL的功能,提供了更强大的数据管理和编程能力。T-SQL由以下几个主要部分组成: 1. **DML(数据操作语言Data Manipulation Language)**: ...
1. **查询编辑器**:提供了一个友好且功能丰富的文本编辑器,用户可以在这里编写SQL语句,支持自动完成和语法高亮,提高编写效率。 2. **结果查看**:执行查询后,查询分析器会以表格形式显示结果,支持排序、过滤、...
Excel 表分析工具:此外接程序提供了一些易于使用的工具,这些工具可利用 SQL Server 2008 的数据挖掘功能对电子表格数据执行强大的分析。此版本中添加了两个新工具:预测计算器和购物篮分析。 Excel 数据挖掘...
2. **自连接或交叉连接**:对于没有`PIVOT`功能的数据库,可以使用自连接或交叉连接来模拟行列转换。这种方法较为复杂,但可以实现类似的效果。 三、使用Analytics函数 1. **窗口函数**:SQL的窗口函数(如`ROW_...
而SQL编辑器通过编写脚本可以显著提高效率,仅需约10分钟就能完成工作,极大地节省了时间和降低了错误率。对于具有唯一性要求的字段,如月租费率和结算计时账目类型关系,可以使用ALTER语句修改字段类型并更新临时表...
- **差异**: SQL Server 2008 引入了新的功能和改进。 - **兼容性**: 大多数T-SQL语法保持一致。 #### 十、管理数据表 ##### 2.1 数据表的基本结构 - **列**: 定义数据类型和约束。 - **主键**: 确保每条记录的...
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表...
如果有三个以上的表连接查询,那么就需要选择交叉表作为基础表。 2. WHERE 子句中的连接顺序:Oracle 采用自下而上的顺序解析 WHERE 子句。因此,表之间的连接必须写在其他 WHERE 条件之前,那些可以过滤掉最大数量...
### SQL Server 数据库基础知识点详解 #### 一、SQL Server 概述 - **SQL Server 定义**:SQL Server 是由微软公司开发的一款高性能的客户端/服务器...这对于后续深入学习 SQL Server 的高级功能打下了坚实的基础。