`
anson_xu
  • 浏览: 513320 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

sql server 交叉表 行转列 显示

阅读更多
三个表(要求把学生每次考试情况列出来)
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交叉表的客户端实现方案.pdf

    SQL Server交叉表的客户端实现方案主要探讨的是如何在SQL Server数据库系统中,通过客户端应用程序来实现交叉表查询,这是在数据分析和报表展示中常见的需求。交叉表,又称透视表,可以将原始数据按照多个维度进行...

    sql server 生成交叉表

    此描述进一步明确了目标是使用标准SQL语法来实现交叉表的功能,即在一个表格中,行和列的数据可以相互转换,形成类似透视的效果。 #### 知识点详解 ### 一、创建临时表并填充数据 ```sql CREATE TABLE #result ( ...

    在Sql Server 数据库中利用存储过程实现动态交叉表

    本文将探讨如何在SQL Server数据库中利用存储过程实现动态交叉表。 首先,我们需要理解交叉表的基本概念。在数据分析和报表生成中,交叉表是一种以行列交叉形式展示数据统计结果的表格,通常用于展示分类数据的汇总...

    SQL Server中交叉表查询的研究.pdf

    SQL Server中交叉表查询的研究.pdf

    SqlServer mssql 交叉查询,横表变纵表

    sql server 交叉查询, 查询结果交叉表,横表变纵表

    sqlserver 交叉表通用存储

    根据提供的信息,我们可以深入探讨SQL Server中的交叉表通用存储技术及其应用。交叉表查询是一种将行数据转换为列数据的方法,常用于报表处理等场景。接下来,我们将详细解析标题、描述以及部分代码所涉及的关键概念...

    SQL动态交叉表,希望对SQL程序员有帮助

    例如,假设我们有一个销售数据表,包含产品、地区和销售额信息,通过Pivot,我们可以把地区列转换为行,将销售额变为对应地区的列,从而得到一个按产品分组,列显示各地区销售额的表。 2. **CASE表达式**:在不支持...

    交叉表的语法动态交叉的sql语句

    交叉表的语法,动态交叉的sql语句交叉表的语法,动态交叉的sql语句 交叉表的语法,动态交叉的sql语句交叉表的语法,动态交叉的sql语句

    在Sql Server数据库中利用存储过程实现动态交叉表.pdf

    "在Sql Server数据库中利用存储过程实现动态交叉表.pdf" 本文主要讲述了在Sql Server数据库中利用存储过程实现动态交叉表的技术。交叉表是一种特殊的表格形式,它可以将数据按照某种规则进行转换和重新组织,以便更...

    SQL Server 交叉表查询 case

    在SQL Server中,交叉表查询(也称为PIVOT查询)是将行数据转换为列数据的一种方法。这种查询在数据分析和报表制作中非常常见,因为它可以将多个行记录的数据整理成更易于阅读的格式。在Access中,可以通过TRANSFORM...

    行转列数据源

    在SQL Server中,"行转列"是一种常见的数据处理技术,它主要用于将表格中的多行数据转换为单行,使得同一类别的数据集中显示在同一列中。这种操作在数据分析、报表制作以及信息展示中非常实用,能够使得数据更加清晰...

    sql交叉表中是使用

    在 SQL Server 中,交叉表(Pivot Table)是一种将一列中的数据转换为多列的方式,从而实现数据的汇总、分析等功能。这种方式非常适合处理需要进行维度变换的数据场景。下面我们将通过一个具体的例子来详细探讨如何...

    sql2000交叉表实例

    ### SQL Server 2000 交叉表实例详解 在SQL Server 2000中,创建交叉表是一项常见的需求,特别是在处理具有多个维度的数据时。例如,在统计各个销售员在全国各省份的客户数量时,我们需要将每个销售员的数据放在一...

    SQLServer实用SQL语句大全

    《SQLServer实用SQL语句大全》是一本涵盖了SQL Server数据库管理与开发的全面指南,旨在帮助用户深入理解和熟练运用SQL语言。此书共分为15个章节,每一章都精心设计,理论结合实践,旨在让读者能够从基础到高级逐步...

    sql server 2005 技术内幕t-sql查询源码

    《SQL Server 2005 技术内幕:T-SQL查询源码》是一本深入探讨SQL Server 2005中T-SQL查询技术的专业书籍。T-SQL(Transact-SQL)是Microsoft SQL Server数据库管理系统中使用的SQL扩展版本,它在标准SQL的基础上增加...

    浅谈SQL Server交叉联接 内部联接

    在SQL Server中,数据库操作经常会涉及到表之间的联接,其中交叉联接(CROSS JOIN)和内部联接(INNER JOIN)是两种常见的联接类型。本文将深入探讨这两种联接方式,以及它们在实际应用中的作用和注意事项。 首先,...

    SQLServer高频面试题及答案

    SQL Server高频面试题及答案 数据库基础知识篇 1. 主键、外键、超键、候选键 超键是关系模式中能唯一标识元组的属性集。候选键是最小超键,即没有冗余元素的超键。主键是数据库表中对储存数据对象予以唯一和完整...

    SQL Server CROSS APPLY和OUTER APPLY的应用详解

    在SQL Server 2000中,我们通常使用CROSS JOIN来实现简单的交叉联接,但是当试图将表值函数的参数设置为另一表的字段时,会出现问题,因为CROSS JOIN不支持这种操作。例如: ```sql -- 错误示例:CROSS JOIN无法...

Global site tag (gtag.js) - Google Analytics