首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个难点

2013-03-26 
一个难题IFEXISTS (SELECT * FROM sys.objects WHERE object_id OBJECT_ID(N[dbo].[employee]) AND ty

一个难题


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[employee]') AND type in (N'U'))
DROP TABLE [dbo].[employee]
GO

CREATE TABLE [dbo].[employee](
[pid] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[deptcode] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[joindate] [datetime]  NULL,
[quitdate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS  NULL
) ON [PRIMARY]
go

insert into employee
select '1','depta','2012-03-29',null
union
select '2','depta','2012-06-11',null
union
select '3','deptb','2011-07-06',null
union
select '4','depta','2012-11-05','2013-02-02'



我现在想要根据joindate加入时间和quitdate离职时间求出几个平均值
比如现在设定为'2013-03-31',那么根据这个时间,我想要求出离指定时间一年内的月均入职率(入职人数/总数),离职率(离职人数/总数)
月末人数

比如depta
要求的时间范围是'2012-04-01'-'2013-03-31'
期望的结果是 
时间       入职率     离职率        月末人数
2012-04    0          0             1
。。。。
2012-06    1/2        0             2
。。。。
2012-11    1/3        0             3  
。。。。
2013-02    0         1/3            2


现在我只想到一个建立时间列临时表然后cross join+group by的方法

想请教下各位大牛有没有好点的办法

sql
[解决办法]
写个存储过程循环计算每个月放到临时表,最后输出结果就可以了
[解决办法]
替换lz的时间临时表,剩下的就跟lz的group by一样了。 

DECLARE @i DATETIME 
SET @i ='2012-03-31'

SELECT MONTH(DATEADD (mm,A.number,@i)) AS 月份,B.*
FROM master..spt_values A
LEFT JOIN employee B ON MONTH(DATEADD (mm,A.number,@i)) = MONTH(B.joindate)
WHERE A.TYPE ='P' AND A.number <12

/*
月份piddeptcodejoindatequitdate
31depta2012-03-29 00:00:00.000NULL
4NULLNULLNULLNULL
5NULLNULLNULLNULL
62depta2012-06-11 00:00:00.000NULL
73deptb2011-07-06 00:00:00.000NULL
8NULLNULLNULLNULL
9NULLNULLNULLNULL
10NULLNULLNULLNULL
114depta2012-11-05 00:00:00.0002013-02-02
12NULLNULLNULLNULL
1NULLNULLNULLNULL
2NULLNULLNULLNULL*/

热点排行