MS SQLServer 交叉报表(行列互换)

在MS-SQLServer 2005 中可以使用pivot运算符来来实现行列转换. ,但在之前版本中必须使用 case when then else end 语句

下面以学生成绩表来举例:

id姓名 科目 成绩

1 张三 语文 60

2 张三 数学 65

3 张三 外语 70

4 李四 语文 80

5 李四 数学 90

6 李四 外语 85

7 王五 语文 70

8 王五 数学 71

9 王五 外语 75

10 赵六 语文 64

11 赵六 数学 67

12 赵六 外语 76

查询后得出:

姓名 语文数学外语

李四 80  90  85

王五 70  71  75

张三 60  65  70

赵六 64  67  76

准备数据:

if exists(select id from sysobjects where xtype=‘U‘ and name=‘studentscore‘)

drop table studentscore--删除与实验冲突的表

go

create table studentscore--创建实验表

(

[id] int identity(1,1),

[name] nvarchar(20) not null,

subject nvarchar(20) not null,

score int not null

)

go

--添加实验数据

insert studentscore values (‘张三‘,‘语文‘,‘60‘);

insert studentscore values (‘张三‘,‘数学‘,‘65‘);

insert studentscore values (‘张三‘,‘外语‘,‘70‘);

insert studentscore values (‘李四‘,‘语文‘,‘80‘);

insert studentscore values (‘李四‘,‘数学‘,‘90‘);

insert studentscore values (‘李四‘,‘外语‘,‘85‘);

insert studentscore values (‘王五‘,‘语文‘,‘70‘);

insert studentscore values (‘王五‘,‘数学‘,‘71‘);

insert studentscore values (‘王五‘,‘外语‘,‘75‘);

insert studentscore values (‘赵六‘,‘语文‘,‘64‘);

insert studentscore values (‘赵六‘,‘数学‘,‘67‘);

insert studentscore values (‘赵六‘,‘外语‘,‘76‘);

go

select [id], [name], subject, score from studentscore

go

1 张三 语文 60

2 张三 数学 65

3 张三 外语 70

4 李四 语文 80

5 李四 数学 90

6 李四 外语 85

7 王五 语文 70

8 王五 数学 71

9 王五 外语 75

10 赵六 语文 64

11 赵六 数学 67

12 赵六 外语 76

先利用case when then else end 语句将行转为列:

select [name],[语文]=sum(case when subject=‘语文‘ then score else null end),

[数学]=sum(case when subject=‘数学‘ then score else null end),

[外语]=sum(case when subject=‘外语‘ then score else null end)

from studentscore group by [name]

查询结果:

李四 80 90 85

王五 70 71 75

张三 60 65 70

赵六 64 67 76

以上查询作用也很大,对于很多情况,比如产品销售表中按照季度统计、按照月份统计等列头内容固定的情况,这样就行了,但往往大多数情况下列头内容是不固定的,象City,用户随时可能删除、添加一些城市,这种情况就是我们所说的动态交叉表,这个时候需要拼下SQL语句了。

SQLServer中局部变量赋值方法

有两种:

一种: set @变量名 = 值

二种: select @变量名 = 值

第二种可以从某个表中得到数据再赋值给变量

例: 从用户信息表中查询中cid为 20 的用户姓名将他赋值给变量 name

declare @name varchar(10) --用户名

select @name=userName from userInfo where cid = 20

print ‘cid为20的用户姓名:‘ + @name

递归的select变量:

递归的select变量是指使用select语句和子查询将一个变量与其自身拼接起来。语法形式如下:select @variable = @variable + table.column from table

declare @sql varchar(max)

set @sql = ‘select [name],‘

select @sql = @sql + ‘sum(case subject when ‘‘‘+subject+‘‘‘

then score else null end) as ‘‘‘+subject+‘‘‘,‘

from (select distinct subject from studentscore) as a

select @sql = left(@sql,len(@sql)-1) + ‘ from studentscore group by [name]‘

exec(@sql)

执行结果:

李四90
85 80

王五 71 75 70

张三 65 70 60

赵六 67 76 64

时间: 2024-10-18 06:11:35

MS SQLServer 交叉报表(行列互换)的相关文章

MS-SQLServer 2000 T-SQL 交叉报表(行列互换) 交叉查询 旋转查询

在MS-SQLServer 2005和oracle 中可以使用Pivot 和 Unpivot来做行列转换,不过不支持动态列哦. 在这里使用 case when then else end 语句,来实现行列转换. 如何实现动态列在最下面. 下面以学生成绩表来举例: id姓名 科目 成绩 1 张三 语文 602 张三 数学 653 张三 外语 704 李四 语文 805 李四 数学 906 李四 外语 857 王五 语文 708 王五 数学 719 王五 外语 7510 赵六 语文 6411 赵六 

报表如何实现行列互换效果?

通常我们设计的二维的交叉报表,横向的维度和纵向的维度是固定的,而用户希望更希望能根据自己的需要快速转换横向纵向维度来查看报表. 如上图所示,我们通过点击一个按钮或文字,就可将报表的行列维度互相转换,这样的动态转换效果要怎么设置实现呢? 这里我介绍两种方法实现方法: 1. 两张报表超链接 2. 单张报表动态判断 两张报表超链接 实现思路: 二维的交叉报表行列维度有两种情况,我们只需对应两种情况做两张报表,切换的按钮用超链接实现,连接的目标就是另一张报表. 具体实现: 1. 新建一张报表,文件名为行

灵活数据源的固定行列交叉报表的制作

论坛里,http://bbs.csdn.net/topics/390883416中提的问题,其目的是为了实现一个固定行列的交叉表,用SQL准备好固定行数的数据源非常麻烦.而润乾集算报表则有非常灵活的计算能力,能够充分利用问题特点应付各种非常规的计算需求. 这里就以链接中业务为背景,给出集算报表实现某种固定列交叉报表的方案. 报表背景         源数据例如以下: 现须要在报表中显演示样例如以下内容: 这里要求依照分类统计总记录数.并将每月的记录数分别填充到1-12月中.当中无数据的记录显示为

将二维数组中的行列互换

情景:二维数组可以存储表格数据,还可以根据下标索引加入各种运算,而且图片的关键运算方法也是以二维数组为基础进行矩阵运算的. //创建二维数组 int arr[][] = new int[][]{{1,2,3},{4,5,6},{7,8,9}}; System.out.println("行列互掉前:"); //输出二维数组 printArray(arr); int arr2[][] = new int[arr.length][arr.length]; //调整数组行列数据 for (in

什么是交叉报表

交叉报表,也是报表当中常见的类型,和分组报表一样,也是基本的报表类型.分组报表是只有行方向上有分组,而交叉报表则是行.列方向都有分组的报表.传统的报表一般都是通过专门的交叉报表生成向导来设计交叉报表.      交叉报表看似简单,但是在实际应用中,特别是处理中国式复杂报表时,作用巨大:主要是因为中国式报表的自身特点决定的. 避开纯技术的数据源和运算等等不说,单单说一说中国报表的形式.中国式报表一般都会有格线,这样会使得报表内容一目了然.在格线划分的时候,交叉形式的格线使用率就很高.这样也就解释了

EF Core实践 (使用MS SqlServer)

这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core)  这里选择web 应用程序,然后更改身份验证 改为 不进行身份验证 然后再包管理控制台里执行下面两条命令 引用 EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore 再引用 EntityFrameworkCore.Sql

行列互换

---psydbnew (PSYP_Trends_GetTestStressorAvgPoint)SELECT QuestionNum,     sum(case when BatchClassName='第一批' then AvgPoint else 0 end )as '第一批',     sum(case when BatchClassName='第二批' then AvgPoint else 0 end )as '第二批',     sum(case when BatchClassNam

Linux下PHP连接MS SQLServer的办法

Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般可以通过ODBC或SQLServer Client连接,这都是Windows下面现成的.但是在Linux下面没有现成的ODBC和SQLServer Client,需要我们自己安装. 解决问题 一.相关软件 freetds-0.53.tgz 这个软件能够用Linux和Unix连接MS SQLServe

ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案

原文:ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案 在 ActiveReports 中可以通过矩阵控件非常方便的实现交叉报表,同时还可以设置数据的分组.排序.过滤.小计.合计等操作,可以满足您报表的智能数据分析等需求.在矩阵控件中组的行数和列数由每个行分组和列分组中的唯一值的个数确定.同时,您可以按行组和列组中的多个字段或表达式对数据进行分组.在运行时,当组合报表数据和数据区域时,随着为列组添加列和为行组添加行,矩阵将在页面上水平和垂直增长. 在矩阵控件中,