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 ...
随机推荐
- springmvc.xml的基本配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...
- visual stuido 跨解决方案调试
visual stuido 跨解决方案调试 一个解决方案是一个第三方库,另一个是单独的程序.调试的时候要同时跟踪源码.因为第三方库并没有直接使用它的源码,而是使用生成的dll,直接进行调试比较麻烦,会 ...
- 【JS】字符串操作
1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...
- CentOS添加用户并加入sudo权限
# 新增用户 useradd username # 设置密码 passwd username # 加入sudo ## 打开sudo配置文件 visudo ## 找到下面这两行,并在下面新增红色部分 # ...
- 我的Hcharts的页面应用
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- mac pods 安装
CocoaPods的安装步骤: 1.先配置Ruby环境: 若已安装Ruby,请升级Ruby环境 sudo gem update --system 若没有安装,则请看下面, 以下代码区域,带有 $ 打头 ...
- 用任务计划管理计划任务对付任务计划-禁止WPS提示升级
作为一名至今还在坚守着64位XP的XP用到死星人,因为准备升级电脑,所以准备移民外星,开始使用Windows7.其实我新电脑买来一年了,为了坚守XP,扔在一边没有装(华硕Z9PE-D8 WS主板,双E ...
- [原创]MvvmLight中用IDialogService替代DialogMessage的用法
在新版的MvvmLight中,DialogMessage被标注为已过时,需要用IDialogService来替代,IDialogService的具体用法如下: 先在主窗体中实现IDialogServi ...
- windows+ant+git+tomcat中ant直接获取git项目部署注意点
最近项目搬迁到公司的"GitHub"上面原来的SVN的ant发布脚本要改下,于是百度ant获取git的方法太少了,windows平台上更是没有所以搞了两天,今天终于有点成果分享给大 ...
- gulp使用过程中出现的问题
在使用gulp的过程中,最容易出现错误的地方就是在安装本地的gulp的时候,错误的原因有: 1.本来是局部安装gulp,但使用命令时还带-g. 2.忘记在局部安装gulp. 以上两种情况出错时会报错, ...