一个难题

xiaotupansy 2013-03-19 09:48:43

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的方法

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

...全文
172 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaotupansy 2013-03-19
  • 打赏
  • 举报
回复
引用 2 楼 OrchidCat 的回复:
替换lz的时间临时表,剩下的就跟lz的group by一样了。 SQL code?12345678910111213141516171819202122DECLARE @i DATETIME SET @i ='2012-03-31' SELECT MONTH(DATEADD (mm,A.number,@i)) AS 月份,B.*FROM master..spt_v……
我试试这个办法,倒是给我启发了下 貌似我走进死胡同了
xiaotupansy 2013-03-19
  • 打赏
  • 举报
回复
引用 1 楼 Haiwer 的回复:
写个存储过程循环计算每个月放到临时表,最后输出结果就可以了
这种方法就是太费时间
Mr_Nice 2013-03-19
  • 打赏
  • 举报
回复
替换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

/*
月份	pid	deptcode	joindate	quitdate
3	1	depta	2012-03-29 00:00:00.000	NULL
4	NULL	NULL	NULL	NULL
5	NULL	NULL	NULL	NULL
6	2	depta	2012-06-11 00:00:00.000	NULL
7	3	deptb	2011-07-06 00:00:00.000	NULL
8	NULL	NULL	NULL	NULL
9	NULL	NULL	NULL	NULL
10	NULL	NULL	NULL	NULL
11	4	depta	2012-11-05 00:00:00.000	2013-02-02
12	NULL	NULL	NULL	NULL
1	NULL	NULL	NULL	NULL
2	NULL	NULL	NULL	NULL*/
昵称被占用了 2013-03-19
  • 打赏
  • 举报
回复
写个存储过程循环计算每个月放到临时表,最后输出结果就可以了

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧