浅谈SQL Server 之 PIVOT运算符用法

相信大家在处理数据库编程时,也许会常用到pivot运算符。今天把我近段时间处理的一个简单报表用到pivot运算符与大家分享一下。

比如,针对一个职员基础表tb_Employee(ID,EmpID,EmpName,DptNo,DptDesc,InDate,...),利用pivot分析职工流动率情况。在入职日期不确定的情况下,如何动态处理所要的结果为题。

即,如何实现:

SELECT DptNo,Dpt,[2000] AS Y2000,[2001] AS Y2001,[2002] AS Y2002,...,[2017] AS Y2017

FROM (

   SELECT DptNo,DptDesc,YEAR(InDate) AS ExpYear

   FROM  tb_Employee WITH (NOLOCK)

    ) t   PIVOT (  COUNT(ExpYear)  FOR ExpYear  IN([2000],[2001],[2002],...,[2017])  ) AS  dptDetail

ORDER BY dptDetail

考虑到不同的部门入职(或离职)的年份不尽相同,要实现根据部门编号灵活呈现流动人员情况,比如编号“A01”的部门或许是2005年和2008年有入职(或离职)职员,而编号是“A02”的部门则是2002年、2005年、2010年及2012年有流动人员信息,等等。为灵活处理此类信息,我个人编写存储过程以动态实现需求,部分编码分享如下,请各位加以指点:

(一、)定义存储过程及需传入的参数

--

--  @ dptno varchar(20)

--1.声明变量

DECLARE @sql  VARCHAR(2000),@sql2  VARCHAR(2000),@dptno VARCHAR(20)

SET @sql=‘SELECT DptNo‘

SET @sql2=‘COUNT(ExpYear)  FOR  ExpYear  IN([1900]‘   --[1900]为虚设

SET @dptno=‘A01‘

--2. 利用游标确定该职工表的所有年份

--2.1.  定义游标

DECLARE cur_ExpYear  CURSOR

FOR  

SELECT ROW_NUMBER()OVER(ORDER BY t1.ExpYear) AS sn,t1.ExpYear

FROM  (SELECT DISTINCT  YEAR(InDate) AS ExpYear  FROM  tb_Employee) t1

--2.2.  打开游标

OPEN cur_ExpYear

--2.3.  使用游标

DECLARE @sn TINYINT,@expyear VARCHAR(10)  FETCH NEXT FROM  cur_ExpYear  INTO  @sn,@expyear

WHILE @@FETCH_STATUS=0

BEGIN

  SET @sql=RTRIM(@sql)+‘,[‘[email protected]+‘]‘+‘  AS  Y‘[email protected]

  SET @sql2=RTRIM(@sql2)+‘,[‘[email protected]+‘]‘

  NEXT FROM cur_ExpYear  INTO   @sn,@expyear

END 

--2.4.  关闭游标并释放游标

CLOSE   cur_ExpYear

DEALLOCATE  cur_ExpYear 

--3.实现目标

SET @sql=RTRIM(@sql)  +‘  FROM (SELECT DptNo,YEAR(InDate) AS ExpYear  FROM  tb_Employee WITH (NOLOCK) )  t PIVOT

(‘  [email protected]+‘)‘  +‘) AS dptDetail  ORDER BY DptNo  ‘

PRINT (@sql)

EXEC (@sql) 

至此,不管职工表如何变化都能实现需求。

时间: 2024-10-13 15:57:52

浅谈SQL Server 之 PIVOT运算符用法的相关文章

浅谈SQL Server数据库分页

数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多方法了.之前在面试中遇到过这一问题,问如何高效实现数据库分页.刚好上周在业务中也遇到了这个需求,所以在这里简单记录和分享一下. 一 需求 这里以SQLServer的示例数据库NorthWind为例,里面有一张Product表,现在假设我们的需求是要以UnitPrice降序排列,并且分页,每一页10条

SQL server 2005 PIVOT运算符的使用

原文:SQL server 2005 PIVOT运算符的使用 PIVOT,UNPIVOT运算符是SQL server 2005支持的新功能之一,主要用来实现行到列的转换.本文主要介绍PIVOT运算符的操作,以及如何实现动态PIVOT的行列转换. 关于UNPIVOT及SQL server 2000下的行列转换请参照本人的其它文章. 一.PIVOT的语法 SELECT [non-pivoted column], -- optional [additional non-pivoted columns]

SQL Server里PIVOT运算符的”红颜祸水“

在今天的文章里我想讨论下SQL Server里一个特别的T-SQL语言结构——自SQL Server 2005引入的PIVOT运算符.我经常引用这个与语言结构是SQL Server里最危险的一个——很快你就会知道为什么.在我们进入特定问题和陷阱前,首先我想给你下使用SQL Server里的PIVOT能实现什么的一个基本概述. 概述 SQL Server里PIVOT运算符背后的基本思想是在T-SQL查询期间,你可以旋转行为列.运算符本身是SQL Server 2005后引入的,主要用在基于建立在实

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色 本篇文章是系列文章中的第四篇,也是最后一篇,本篇文章需要前三篇的文章知识作为基础,前三篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 本篇文章是系列文章中的第二篇,以防你还没有看过第一篇.上一篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging技术来保证了事务日志的原子性和持久性.而这项技术不仅仅保证了ACID

浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架

浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确保了事务的ACID属性.在SQL Server崩溃时,DBA还可以通过事务日志将数据恢复到指定的时间点.当SQL Server运转良好时,多了解一些事务日志的原理和概念显得并不是那么重要.但是,一旦SQL SERVER发生崩

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 本篇文章是系列文章中的第三篇,前两篇的地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 简介 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.在开始文章之前,首先

浅谈SQL Server任务调度

在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎 与SSMS抽象模型,SQL Server内部存储机制和SQL Server内部体系结构等.讨论的这些问题,均可以归为一个问题,即"SQL Server是怎么执行客户端输入的SQL 语句的?”,其中,重点讨论了下图(SQL Server 体系结构) 然而,如果我们仅仅了解如上技术,是不具备一个资深DBA或数据库优化

浅谈SQL Server 对于内存的管理

简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) 对于计算机来说,存储体系是分层级的.离CPU越近的地方速度愉快,但容量越小(如图1所示).比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘.但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级.比如硬盘通常要比同时代的内存大一个数量级.