T-SQL Recipes之Customized Database Objects
The Problem
创建灵活自定义对象决非是一个简单的任务。比如HR想看每种工作职称在所有年限里面的入职累计情况
The Solution
我们一步一步来拆解吧:
- 获取入职年限的集合,如1999,2000,2001...etc
- 根据唯一值来统计每年的入职数量,当然是得用动态PIVOT
- 然后写进SP里面
示例1:获取年限集合
DECLARE @hire_date_years TABLE
(
hire_date_year NVARCHAR(50)
);
INSERT INTO @hire_date_years
( hire_date_year
)
SELECT DISTINCT
DATEPART(YEAR, Employee.HireDate)
FROM HumanResources.Employee; DECLARE @sql_yearlist NVARCHAR(MAX); SELECT @sql_yearlist = ISNULL(@sql_yearlist, '') + ','
+ QUOTENAME(hire_date_year)
FROM @hire_date_years SET @sql_yearlist = STUFF(@sql_yearlist, 1, 1, '') SELECT @sql_yearlist
示例2 根据唯一值来统计
DECLARE @hire_date_years TABLE
(
hire_date_year NVARCHAR(50)
);
DECLARE @sql_yearlist NVARCHAR(MAX);
DECLARE @sql_command NVARCHAR(MAX); INSERT INTO @hire_date_years
( hire_date_year
)
SELECT DISTINCT
DATEPART(YEAR, Employee.HireDate)
FROM HumanResources.Employee; SELECT @sql_yearlist = ISNULL(@sql_yearlist, '') + N','
+ QUOTENAME(hire_date_year)
FROM @hire_date_years SET @sql_yearlist = STUFF(@sql_yearlist, 1, 1, '') SET @sql_command = N'
WITH employee_data
AS ( SELECT Employee.BusinessEntityID ,
Employee.JobTitle ,
DATEPART(YEAR, Employee.HireDate) AS HireDate_Year
FROM HumanResources.Employee
) SELECT
JobTitle,' + @sql_yearlist + N'
FROM employee_data
PIVOT (COUNT(BusinessEntityID) FOR HireDate_Year IN (' + @sql_yearlist + N')) pivot_data' PRINT @sql_command
示例3: 写进SP里面
IF OBJECT_ID(N'dbo.job_title_year_summary', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo.job_title_year_summary;
END SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO CREATE PROCEDURE job_title_year_summary
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON; DECLARE @hire_date_years TABLE
(
hire_date_year NVARCHAR(50)
);
DECLARE @sql_yearlist NVARCHAR(MAX);
DECLARE @sql_command NVARCHAR(MAX); INSERT INTO @hire_date_years
( hire_date_year
)
SELECT DISTINCT
DATEPART(YEAR, Employee.HireDate)
FROM HumanResources.Employee; SELECT @sql_yearlist = ISNULL(@sql_yearlist, '') + N','
+ QUOTENAME(hire_date_year)
FROM @hire_date_years SET @sql_yearlist = STUFF(@sql_yearlist, 1, 1, '') SET @sql_command = N'
WITH employee_data
AS ( SELECT Employee.BusinessEntityID ,
Employee.JobTitle ,
DATEPART(YEAR, Employee.HireDate) AS HireDate_Year
FROM HumanResources.Employee
) SELECT
JobTitle,' + @sql_yearlist + N'
FROM employee_data
PIVOT (COUNT(BusinessEntityID) FOR HireDate_Year IN (' + @sql_yearlist + N')) pivot_data' PRINT @sql_command;
EXEC sp_executesql @sql_command;
END
GO
有了这个存储过程,以后需要用它时,可以用昨时表来存储它的结果,做后一步的处理。
T-SQL Recipes之Customized Database Objects的更多相关文章
- [转]SQL SERVER – Importance of Database Schemas in SQL Server
原文地址http://blog.sqlauthority.com/2009/09/07/sql-server-importance-of-database-schemas-in-sql-server/ ...
- SQL SERVER 2008配置Database Mail –用SQL 数据库发邮件
SQL SERVER 2008配置Database Mail –用SQL 数据库发邮件 https://blogs.msdn.microsoft.com/apgcdsd/2011/06/28/sql ...
- 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...
- Import MySQL Dumpfile, SQL Datafile Into My Database
How can I import a MySQL dumpfile into my database? I'm using CentOS Linux 5 server. My old hosting ...
- Arcgis sde 10.1您不能创建在安装后的空间库,提示User has privileges required to create database objects.
Geodatabase在10.1版本号也有较大的改进和更新,在用户体验和性能上都有变化,在实际的工作中可能会碰到各种奇怪的问题(事实上都是有原因的,须要我们对其工作机制有所了解才干避免其发生):近期须 ...
- Easy way to change collation of all database objects in SQL Server
This info is from: http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of- ...
- DRUPAL-PSA-CORE-2014-005 && CVE-2014-3704 Drupal 7.31 SQL Injection Vulnerability /includes/database/database.inc Analysis
目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Use Drupal to build everything from perso ...
- drop all database objects
/*Use this sql to drop all objects in a database.*/ -- Drop all SPdeclare @dropSp varchar(max)=''sel ...
- Learning Note: SQL Server VS Oracle–Database architecture
http://www.sqlpanda.com/2013/07/learning-note-sql-server-vs.html This is my learning note base on t ...
随机推荐
- angularjs $scope.$apply 方法详解
myApp.controller('firstController',function($scope,$interval){ $scope.date = new Date(); setInterval ...
- angularJS绑定数据时自动转义html标签
angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签中的注入攻击,但有些时候还是需要的,特别是从数据库读取 ...
- Maven的POM.xml配置大全
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://mave ...
- 【GitHub Desktop】MacOS和Win下配置及简单的使用
一. GitHub介绍 1.GitHub 是为开发者提供 Git 仓库的托管服务.这是一个让开发者与朋友.同事.同学及陌生人共享代码的完美场所. 总结一下,GitHub 最大的特征是"面向人 ...
- Django模板与Vue.js冲突问题
参考: https://my.oschina.net/soarwilldo/blog/755984 方法1:修改vue.js的默认的绑定符号 Vue.config.delimiters = [&quo ...
- cocos2d-x宏定义
1 ccp : The "ccp" prefix means: "CoCos2d Point" //查看: ../cocos2d-x-2.2/cocos2dx/ ...
- ubuntu 加载新硬盘或分区
查看目前挂载情况 df -lh 查看新的空间或硬盘 fdisk -lu 新硬盘分区 fdisk /dev/sda 输入m 根据提示输入n(创建一个分区) 然后输入e(扩展分区) 输入分区数1 然后指定 ...
- MMAP和DIRECT IO区别
看完此文,题目不言自明.转自 http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的东西,技术人员非常关 ...
- 阿里云部署多个tomcat
转载自:http://www.cnblogs.com/lhj588/p/3805268.html 同时支持windows阿里云服务器 部署前准备: 1.到阿里云官网购买一台服务器 2.给阿里云服务器挂 ...
- tp5 model 中的查询范围(scope)
查询范围scope在model中定义,在controller中使用 namespace app\index\model; use think\Model; class User extends Mod ...