sql server 创建动态交叉表
我所了解的创建动态交叉表有两种方法,如下图,有这样一张销售表 ,我想统计个人的销售业绩,如图二表示出来,
创建销售表
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 创建动态交叉表相关推荐
- SQL Server 2005 处理交叉表
--原贴:http://community.csdn.net/Expert/topic/4617/4617995.xml?temp=4.882449E-02 日期 时间 售货 ...
- SQL Server创建表和添加列
撰写时间:2022 年 4 月 27日 SQLServer创建表和添加列 SQL Server创建表: 表用于在数据库中存储数据:表在数据库和模式中唯一命名.每个表包含一个或多个列.每列都有一个相关的 ...
- 使用SQL Server创建表
使用SQL Server创建表 一.CREATE TABLE语句简介: 表用于在数据库中存储数据. 表在数据库和模式中唯一命名. 每个表包含一个或多个列. 每列都有一个相关的数据类型,用于定义它可以存 ...
- SQL Server 2005 术语词汇表
术语 定义 ActiveX 数据对象 (ActiveX Data Objects) 一种易于使用的应用程序编程接口 (API),用于封装 OLE DB 以在诸如 Visual Basic.Visual ...
- SQL Server 2014 内存优化表(1)实现内存优化表
内存优化表(Memory-Optimized Tables)是SQL Server 2014的新特性,目前仅适用于评估版(Evaluation Edition).开发版(Developer Editi ...
- 如何在SQL Server中自动进行表分区
In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...
- 在MySQL中实现交叉表查询2(动态交叉表)
在MySQL中实现交叉表查询2(动态交叉表) 交叉表分为静态交叉表和动态交叉表.其中静态交叉表中的列是固定的,因此相对容易实现:而动态交叉表中的列需要动态生成. 一.静态交叉表的实现 参见上一篇文章: ...
- Microsoft SQL Server 实现数据透视表
文章目录 使用 CASE 表达式和分组聚合 使用 PIVOT 运算符 创建动态透视表 总结 大家好,我是只谈技术不剪发的 Tony 老师.数据透视表(Pivot Table)是 Excel 中一个非常 ...
- SQL Server创建表语句介绍
SQL Server创建表是最常见也是最常用的操作之一,下面就为您介绍SQL Server创建表的语句写法,供您参考,希望可以让您对SQL Server创建表方面有更深的认识. USE suntest ...
最新文章
- 工作日志-W1444
- ML之LiR2PolyR:使用线性回归LiR、二次多项式回归2PolyR模型在披萨数据集上拟合(train)、价格回归预测(test)
- CSS3属性之background
- .net框架读书笔记---通用对象操作(一)
- js深拷贝,浅拷贝的解析以及解决方案
- leetcode971. Flip Binary Tree To Match Preorder Traversal
- 使用Java快速开发一个新闻爬虫项目
- React中获取地址栏传参
- win10网络计算机打不开,win10网络和internet设置打不开怎么办_win10网络设置打不开无法打开的解决方法...
- 免费网页版PS,太好用了
- 核心数据库保护安全技术实践
- java计算机毕业设计科技项目在线评审系统MyBatis+系统+LW文档+源码+调试部署
- android aar 自动引入依赖
- Java虚拟机知识点快速复习手册(上)
- Coursera 机器学习 -- 逻辑回归 笔记 【第二周】
- js调用linux命令行,shelljs
- 手机软件android_sync,SMBSync2安卓手机SMB同步软件使用方法
- 使用Java 编写将阿拉伯数字转为中文数字的代码
- uniApp开发小程序(7)使用mescroll配置上啦下拉的样式,以及分类页面的配置
- 大电流dcdc降压芯片20a_一种高效率大电流的DC-DC降压电源设计