我所了解的创建动态交叉表有两种方法,如下图,有这样一张销售表 ,我想统计个人的销售业绩,如图二表示出来,

创建销售表

CREATE TABLE [dbo].[销售]([ID] [int] NOT NULL,[员工姓名] [nvarchar](25) NULL,[所在部门] [nvarchar](15) NULL,[销售业绩] [int] NULL
) ON [PRIMARY]

图一,图二

方法一:使用游标创建动态交叉表

CREATE procedure Corss
@strTabName as varchar(50) = '销售',
@strCol as varchar(50) = '所在部门',
@strGroup as varchar(50) = '员工姓名',--分组字段
@strNumber as varchar(50) = '销售业绩', --被统计的字段
@strSum as varchar(10) = 'Sum' --运算方式
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 + ', ' + @strSum + '(' + @strNumber + ') AS [' + @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 +  ']' --构造查询
END
SET @strsql = @strsql + ' from ' + @strTabname + ' group by ' + @strGroup --查询结尾
EXECUTE(@strsql) --执行
IF @@error <>0 RETURN @@error --如果出错,返回错误代码
CLOSE corss_cursor
DEALLOCATE corss_cursor RETURN 0 --释放游标,返回0表示成功
end

输出动态交叉表


DECLARE @RC int
DECLARE @strTabName varchar(50)
DECLARE @strCol varchar(50)
DECLARE @strGroup varchar(50)
DECLARE @strNumber varchar(50)
DECLARE @strSum varchar(10)
EXEC @RC = [db_Chapter5].[dbo].[Corss] DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT
DECLARE @PrnLine nvarchar(4000)
PRINT '存储过程: db_Chapter5.dbo.Corss'
SELECT @PrnLine = '  返回代码 = ' + CONVERT(nvarchar, @RC)
PRINT @PrnLine

二:使用递归的select变量,创建动态交叉表


DECLARE @strSql as varchar(1000) select @strSql=isnull(@strSql, '')+char(13)+'   ,sum(case when [所在部门] = '''+[所在部门]+''' then [销售业绩] else null end) as ['+[所在部门]+']' from (select distinct [所在部门] from 销售) a
SET @strsql ='select [员工姓名],sum([销售业绩]) as [ 销售业绩]  ' + @strSql + ' from 销售 group by [员工姓名]'exec(@strsql)

个人更喜欢使用方法二,执行速度相比较游标很快,而且所需的代码量也少。

sql server 创建动态交叉表相关推荐

  1. SQL Server 2005 处理交叉表

    --原贴:http://community.csdn.net/Expert/topic/4617/4617995.xml?temp=4.882449E-02 日期            时间   售货 ...

  2. SQL Server创建表和添加列

    撰写时间:2022 年 4 月 27日 SQLServer创建表和添加列 SQL Server创建表: 表用于在数据库中存储数据:表在数据库和模式中唯一命名.每个表包含一个或多个列.每列都有一个相关的 ...

  3. 使用SQL Server创建表

    使用SQL Server创建表 一.CREATE TABLE语句简介: 表用于在数据库中存储数据. 表在数据库和模式中唯一命名. 每个表包含一个或多个列. 每列都有一个相关的数据类型,用于定义它可以存 ...

  4. SQL Server 2005 术语词汇表

    术语 定义 ActiveX 数据对象 (ActiveX Data Objects) 一种易于使用的应用程序编程接口 (API),用于封装 OLE DB 以在诸如 Visual Basic.Visual ...

  5. SQL Server 2014 内存优化表(1)实现内存优化表

    内存优化表(Memory-Optimized Tables)是SQL Server 2014的新特性,目前仅适用于评估版(Evaluation Edition).开发版(Developer Editi ...

  6. 如何在SQL Server中自动进行表分区

    In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...

  7. 在MySQL中实现交叉表查询2(动态交叉表)

    在MySQL中实现交叉表查询2(动态交叉表) 交叉表分为静态交叉表和动态交叉表.其中静态交叉表中的列是固定的,因此相对容易实现:而动态交叉表中的列需要动态生成. 一.静态交叉表的实现 参见上一篇文章: ...

  8. Microsoft SQL Server 实现数据透视表

    文章目录 使用 CASE 表达式和分组聚合 使用 PIVOT 运算符 创建动态透视表 总结 大家好,我是只谈技术不剪发的 Tony 老师.数据透视表(Pivot Table)是 Excel 中一个非常 ...

  9. SQL Server创建表语句介绍

    SQL Server创建表是最常见也是最常用的操作之一,下面就为您介绍SQL Server创建表的语句写法,供您参考,希望可以让您对SQL Server创建表方面有更深的认识. USE suntest ...

最新文章

  1. 工作日志-W1444
  2. ML之LiR2PolyR:使用线性回归LiR、二次多项式回归2PolyR模型在披萨数据集上拟合(train)、价格回归预测(test)
  3. CSS3属性之background
  4. .net框架读书笔记---通用对象操作(一)
  5. js深拷贝,浅拷贝的解析以及解决方案
  6. leetcode971. Flip Binary Tree To Match Preorder Traversal
  7. 使用Java快速开发一个新闻爬虫项目
  8. React中获取地址栏传参
  9. win10网络计算机打不开,win10网络和internet设置打不开怎么办_win10网络设置打不开无法打开的解决方法...
  10. 免费网页版PS,太好用了
  11. 核心数据库保护安全技术实践
  12. java计算机毕业设计科技项目在线评审系统MyBatis+系统+LW文档+源码+调试部署
  13. android aar 自动引入依赖
  14. Java虚拟机知识点快速复习手册(上)
  15. Coursera 机器学习 -- 逻辑回归 笔记 【第二周】
  16. js调用linux命令行,shelljs
  17. 手机软件android_sync,SMBSync2安卓手机SMB同步软件使用方法
  18. 使用Java 编写将阿拉伯数字转为中文数字的代码
  19. uniApp开发小程序(7)使用mescroll配置上啦下拉的样式,以及分类页面的配置
  20. 大电流dcdc降压芯片20a_一种高效率大电流的DC-DC降压电源设计

热门文章

  1. 存款利息python题_c#入门之实现简易存款利息计算器示例
  2. 这些东西80后真的懂 90后未必懂
  3. UML建模与软件开发设计(二)——UML概述
  4. Ubuntu 12.04 常用三种输入法及键盘错乱的调整
  5. python汇率换算程序_Python第六课 汇率兑换4.0
  6. js根据时间戳倒计时
  7. 基于微信小程序java音乐播放器毕业设计论文/程序代码
  8. 新加坡南洋理工大学招募博士生、博士后、研究工程师和研究科学家
  9. 计算机如何恢复桌面,如何恢复计算机桌面图标不见了
  10. echarts 数据区域缩放