T-SQL Recipes之Customized Database Objects
生活随笔
收集整理的這篇文章主要介紹了
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 DISTINCTDATEPART(YEAR, Employee.HireDate)FROM HumanResources.Employee;DECLARE @sql_yearlist NVARCHAR(MAX);SELECT @sql_yearlist = ISNULL(@sql_yearlist, '') + ','+ QUOTENAME(hire_date_year) FROM @hire_date_yearsSET @sql_yearlist = STUFF(@sql_yearlist, 1, 1, '')SELECT @sql_yearlist View Code示例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 DISTINCTDATEPART(YEAR, Employee.HireDate)FROM HumanResources.Employee;SELECT @sql_yearlist = ISNULL(@sql_yearlist, '') + N','+ QUOTENAME(hire_date_year) FROM @hire_date_yearsSET @sql_yearlist = STUFF(@sql_yearlist, 1, 1, '')SET @sql_command = N' WITH employee_dataAS ( SELECT Employee.BusinessEntityID ,Employee.JobTitle ,DATEPART(YEAR, Employee.HireDate) AS HireDate_YearFROM 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 View Code示例3: 寫進SP里面
IF OBJECT_ID(N'dbo.job_title_year_summary', 'P') IS NOT NULL BEGINDROP PROCEDURE dbo.job_title_year_summary; ENDSET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOCREATE 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 DISTINCTDATEPART(YEAR, Employee.HireDate)FROM HumanResources.Employee;SELECT @sql_yearlist = ISNULL(@sql_yearlist, '') + N','+ QUOTENAME(hire_date_year)FROM @hire_date_yearsSET @sql_yearlist = STUFF(@sql_yearlist, 1, 1, '')SET @sql_command = N'WITH employee_dataAS ( SELECT Employee.BusinessEntityID ,Employee.JobTitle ,DATEPART(YEAR, Employee.HireDate) AS HireDate_YearFROM HumanResources.Employee)SELECT JobTitle,' + @sql_yearlist + N'FROM employee_dataPIVOT (COUNT(BusinessEntityID) FOR HireDate_Year IN (' + @sql_yearlist + N')) pivot_data'PRINT @sql_command;EXEC sp_executesql @sql_command; END GO View Code有了這個存儲過程,以后需要用它時,可以用昨時表來存儲它的結果,做后一步的處理。
轉載于:https://www.cnblogs.com/cdjboy/p/5567760.html
總結
以上是生活随笔為你收集整理的T-SQL Recipes之Customized Database Objects的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我对模板模式和策略模式的理解
- 下一篇: linux cmake编译源码,linu