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 ...
随机推荐
- linux下vmware的安装、物理分区使用及卸载
1.安装 先下载安装文件VMware-Workstation-Full-12 在命令行下执行下载的文件安装即可(需要root权限) wget https://download3.vmware.com/ ...
- 使用外部web组件-----easyUI、jQueryUI、Bootstrap、js正则表达式
1.使用外部web组件,以Bootstrap为例 <head> <link rel='stylesheet' href='bootstrap-3.3.0-dist/dist/css ...
- ubuntu 加载新硬盘或分区
查看目前挂载情况 df -lh 查看新的空间或硬盘 fdisk -lu 新硬盘分区 fdisk /dev/sda 输入m 根据提示输入n(创建一个分区) 然后输入e(扩展分区) 输入分区数1 然后指定 ...
- Sass 的调试
Sass 的调试 Sass 调试一直以来都是一件头痛的事情,使用 Sass 的同学都希望能在浏览器中直接调试 Sass 文件,能找到对应的行数.值得庆幸的是,现在实现并不是一件难事,只要你的浏览器支持 ...
- iOS 对象和json互相转换
// 将字典或者数组转化为JSON串 - (NSData *)toJSONData:(id)theData { NSError *error = nil; NSData *jsonData = [NS ...
- linux添加私有的ip
在虚拟机上的网络适配器设置为仅主机模式,重启linux系统,ifconfig查看所得的就是linux自动配置的私有ip.
- React学习笔记-4-什么是生命周期
什么是声明周期?组件本质上就是状态机,输入确定,输出一定确定.如何理解这一点?react有两个特点,第一个就是去除了所有的手动dom操作,也就是使用jsx.第二个就是组件把状态和结果一一对应起来,从而 ...
- json_decode返回NULL
最近在调用某公司的API时,将对方返回的数据,使用PHP的json_decode函数解析,但是返回NULL,最终排查为对方传送来的json格式有误 打印$_REQUEST,数据结构大致如下: arra ...
- Lintcode 375.克隆二叉树
-------------------------- 水题 AC代码: /** * Definition of TreeNode: * public class TreeNode { * public ...
- SimpleXML操控XML
复杂字符串如下: $_xml=<<<_xml <?xml version="1.0" encoding="utf-8"?> < ...