三个表(要求把学生每次考试情况列出来)
CREATE TABLE [dbo].[score](
[stuid] [int] NOT NULL,
[sid] [int] NOT NULL,
[score] [int] NOT NULL,
[examtimes] [int] NULL
)
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050701 , 1001 , 10 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050701 , 1002 , 20 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050701 , 1003 , 30 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050702 , 1001 , 11 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050702 , 1002 , 21 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050702 , 1003 , 31 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050703 , 1001 , 12 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050703 , 1002 , 22 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050703 , 1003 , 32 , 1 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050701 , 1001 , 110 , 2 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050701 , 1002 , 120 , 2 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050701 , 1003 , 130 , 2 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050702 , 1001 , 111 , 2 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050702 , 1002 , 121 , 2 )
INSERT [score] ( [stuid] , [sid] , [score] , [examtimes] ) VALUES ( 2010050702 , 1003 , 131 , 2 )
CREATE TABLE [Student] ( [studi] [int] NOT NULL , [stuname] [nvarchar] (50) NOT NULL )
INSERT [Student] ( [studi] , [stuname] ) VALUES ( 2010050701 , '张三' )
INSERT [Student] ( [studi] , [stuname] ) VALUES ( 2010050702 , '李四' )
INSERT [Student] ( [studi] , [stuname] ) VALUES ( 2010050703 , '王五' )
CREATE TABLE [Subject] ( [sid] [int] NOT NULL , [sname] [varchar] (50) NOT NULL )
INSERT [Subject] ( [sid] , [sname] ) VALUES ( 1001 , '语文' )
INSERT [Subject] ( [sid] , [sname] ) VALUES ( 1002 , '数学' )
INSERT [Subject] ( [sid] , [sname] ) VALUES ( 1003 , '英语' )
create view view_stu as --三个表Student(学生信息表一),Score(多对多关联表,有成绩字段多),Subject(课程名表一)
select a.stuname,c.sname,b.score,b.examtimes from Student a left join score b on a.studi=b.stuid
inner join Subject c on b.sid=c.sid group by a.stuname,b.examtimes,c.sname,b.score
select * from view_stu --查询视图,得到一个过滤后能做列和分组行的表
--此存储过程可通用,只需把视图和变量更改就可以
CREATE procedure CorssTab
@strTabName as varchar(50) = 'view_stu', --此处放表名
@strCol as varchar(50) = 'sname', --表头分组依据字段
@strGroup as varchar(50) = 'stuname',--分组字段
@strNumber as varchar(50) = 'score', --被统计的字段
@strSum as varchar(10) = 'Sum', --运算方式
@examtimes as varchar(10) = 'examtimes' --第几次考试
AS
DECLARE @strSql as varchar(1000), @strTmpCol as varchar(100)
EXECUTE ('DECLARE corss_cursor CURSOR FOR SELECT DISTINCT ' + @strCol + ' from ' + @strTabName + ' for read only ') --生成游标
begin
SET nocount ON
SET @strsql ='select ' + @strGroup + ',' + @examtimes + ', ' + @strSum + '(' + @strNumber + ') AS [' + @strSum + ' of ' + @strNumber + ']' --查询的前半段
OPEN corss_cursor
while (0=0)
BEGIN
FETCH NEXT FROM corss_cursor --遍历游标,将列头信息放入变量@strTmpCol
INTO @strTmpCol
if (@@fetch_status<>0) break
SET @strsql = @strsql + ', ' + @strSum + '(CASE ' + @strCol + ' WHEN ''' + @strTmpCol + ''' THEN ' + @strNumber + ' ELSE Null END) AS [' + @strTmpCol + ' ' + @strCol + ']' --构造查询
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup+','+ @examtimes --查询结尾
EXECUTE(@strsql) --执行
IF @@error <>0 RETURN @@error --如果出错,返回错误代码
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功
end
GO
EXEC CorssTab --运行存储过程
如果是固定列,就不用存储过程
select distinct t.name 姓名,t1.grade 语文,t2.grade 数学,t3.grade 英语
from course t,
(select c.name,c.grade from course c where c.subject='语文')t1,
(select c.name,c.grade from course c where c.subject='数学')t2,
(select c.name,c.grade from course c where c.subject='英语')t3
where t.name=t1.name
and t.name = t2.name
and t.name = t3.name
- 大小: 225.8 KB
分享到:
相关推荐
SQL Server交叉表的客户端实现方案主要探讨的是如何在SQL Server数据库系统中,通过客户端应用程序来实现交叉表查询,这是在数据分析和报表展示中常见的需求。交叉表,又称透视表,可以将原始数据按照多个维度进行...
此描述进一步明确了目标是使用标准SQL语法来实现交叉表的功能,即在一个表格中,行和列的数据可以相互转换,形成类似透视的效果。 #### 知识点详解 ### 一、创建临时表并填充数据 ```sql CREATE TABLE #result ( ...
本文将探讨如何在SQL Server数据库中利用存储过程实现动态交叉表。 首先,我们需要理解交叉表的基本概念。在数据分析和报表生成中,交叉表是一种以行列交叉形式展示数据统计结果的表格,通常用于展示分类数据的汇总...
SQL Server中交叉表查询的研究.pdf
sql server 交叉查询, 查询结果交叉表,横表变纵表
根据提供的信息,我们可以深入探讨SQL Server中的交叉表通用存储技术及其应用。交叉表查询是一种将行数据转换为列数据的方法,常用于报表处理等场景。接下来,我们将详细解析标题、描述以及部分代码所涉及的关键概念...
例如,假设我们有一个销售数据表,包含产品、地区和销售额信息,通过Pivot,我们可以把地区列转换为行,将销售额变为对应地区的列,从而得到一个按产品分组,列显示各地区销售额的表。 2. **CASE表达式**:在不支持...
交叉表的语法,动态交叉的sql语句交叉表的语法,动态交叉的sql语句 交叉表的语法,动态交叉的sql语句交叉表的语法,动态交叉的sql语句
"在Sql Server数据库中利用存储过程实现动态交叉表.pdf" 本文主要讲述了在Sql Server数据库中利用存储过程实现动态交叉表的技术。交叉表是一种特殊的表格形式,它可以将数据按照某种规则进行转换和重新组织,以便更...
在SQL Server中,交叉表查询(也称为PIVOT查询)是将行数据转换为列数据的一种方法。这种查询在数据分析和报表制作中非常常见,因为它可以将多个行记录的数据整理成更易于阅读的格式。在Access中,可以通过TRANSFORM...
在SQL Server中,"行转列"是一种常见的数据处理技术,它主要用于将表格中的多行数据转换为单行,使得同一类别的数据集中显示在同一列中。这种操作在数据分析、报表制作以及信息展示中非常实用,能够使得数据更加清晰...
在 SQL Server 中,交叉表(Pivot Table)是一种将一列中的数据转换为多列的方式,从而实现数据的汇总、分析等功能。这种方式非常适合处理需要进行维度变换的数据场景。下面我们将通过一个具体的例子来详细探讨如何...
### SQL Server 2000 交叉表实例详解 在SQL Server 2000中,创建交叉表是一项常见的需求,特别是在处理具有多个维度的数据时。例如,在统计各个销售员在全国各省份的客户数量时,我们需要将每个销售员的数据放在一...
《SQLServer实用SQL语句大全》是一本涵盖了SQL Server数据库管理与开发的全面指南,旨在帮助用户深入理解和熟练运用SQL语言。此书共分为15个章节,每一章都精心设计,理论结合实践,旨在让读者能够从基础到高级逐步...
《SQL Server 2005 技术内幕:T-SQL查询源码》是一本深入探讨SQL Server 2005中T-SQL查询技术的专业书籍。T-SQL(Transact-SQL)是Microsoft SQL Server数据库管理系统中使用的SQL扩展版本,它在标准SQL的基础上增加...
在SQL Server中,数据库操作经常会涉及到表之间的联接,其中交叉联接(CROSS JOIN)和内部联接(INNER JOIN)是两种常见的联接类型。本文将深入探讨这两种联接方式,以及它们在实际应用中的作用和注意事项。 首先,...
SQL Server高频面试题及答案 数据库基础知识篇 1. 主键、外键、超键、候选键 超键是关系模式中能唯一标识元组的属性集。候选键是最小超键,即没有冗余元素的超键。主键是数据库表中对储存数据对象予以唯一和完整...
在SQL Server 2000中,我们通常使用CROSS JOIN来实现简单的交叉联接,但是当试图将表值函数的参数设置为另一表的字段时,会出现问题,因为CROSS JOIN不支持这种操作。例如: ```sql -- 错误示例:CROSS JOIN无法...