有一表如下結構tab1:
id(自動增長型),empno,empdate(異動日期)
另有一tab2:
有其中一些字段:id(自動增長型),empno,empname,indate(入職日期),outdate(離職日期)想得出如下結果:
對empno分組且上條的empdate作為起始時間,下一條的記錄作為終止時間,且入職日期作為第一條(對單一empno而言)記錄的起始時間,離職日期作為最後一條記錄的終止時間
類似:
empno,empname,sdate,edate請各位高手幫手!
id(自動增長型),empno,empdate(異動日期)
另有一tab2:
有其中一些字段:id(自動增長型),empno,empname,indate(入職日期),outdate(離職日期)想得出如下結果:
對empno分組且上條的empdate作為起始時間,下一條的記錄作為終止時間,且入職日期作為第一條(對單一empno而言)記錄的起始時間,離職日期作為最後一條記錄的終止時間
類似:
empno,empname,sdate,edate請各位高手幫手!
1 321 2007-04-17 00:00:00.000
2 192 2007-04-17 00:00:00.000
3 193 2007-04-17 00:00:00.000
17 240 2007-04-18 00:00:00.000
18 192 2007-04-18 00:00:00.000
19 193 2007-04-18 00:00:00.000
21 195 2007-04-18 00:00:00.000
5 195 2007-04-17 00:00:00.000
753 192 2007-04-23 00:00:00.000
755 193 2007-04-23 00:00:00.000
759 195 2007-04-23 00:00:00.000tab2中的記錄:
1 192 2004-06-11 00:00:00.000 NULL
10 193 2004-07-12 00:00:00.000 NULL
15 195 2004-09-02 00:00:00.000 NULL
66 240 2006-05-26 00:00:00.000 NULL
156 321 2006-06-05 00:00:00.000 2006-12-29 00:00:00.000
1 192 刘香生 2004-06-11 00:00:00.000 NULL
10 193 黄桂秀 2004-07-12 00:00:00.000 NULL
15 195 钟小玲 2004-09-02 00:00:00.000 NULL
66 240 李惠清 2006-05-26 00:00:00.000 NULL
156 321 龙小琼 2006-06-05 00:00:00.000 2006-12-29 00:00:00.000
(select empno,empdate from tab1 union all
select empno,indate from tab2 union all
select empno,outdate from tab2 )a
inner join
(select distinct empno,empname from tab2) b on a.empno=b.empnoselect *,(select min(empdate) from #b where empno=a.empno and empdate>a.empdate ) from #b a我想这样应可以~
empno empname sdate edate
192 刘香生 2004-06-11 2007-04-17
192 刘香生 2007-04-17 2007-04-18
192 刘香生 2007-04-18 2007-04-23
192 刘香生 2007-04-23
193 黄桂秀 2004-07-12 2007-04-17
193 黄桂秀 2007-04-17 2007-04-18
193 黄桂秀 2007-04-18 2007-04-23
193 黄桂秀 2007-04-23
195 钟小玲 2004-09-02 2007-04-17
195 钟小玲 2007-04-17 2007-04-18
195 钟小玲 2007-04-18 2007-04-23
195 钟小玲 2007-04-23
240 李惠清 2006-05-26 2007-04-18
240 李惠清 2007-04-18
321 龙小琼 2006-06-05 2007-04-17
321 龙小琼 2007-04-17 2007-12-29由於測試記錄的問題,請把
156 321 龙小琼 2006-06-05 00:00:00.000 2006-12-29 00:00:00.000
改成:156 321 龙小琼 2006-06-05 00:00:00.000 2007-12-29 00:00:00.000
要不會出現邏輯上的錯誤
謝謝了
create table tab1 (id int ,empno int ,empdate datetime)
insert into tab1
select 1 ,321 ,'2007-04-17 00:00:00.000' union all
select 2 ,192 ,'2007-04-17 00:00:00.000' union all
select 3 ,193 ,'2007-04-17 00:00:00.000'union all
select 17 ,240 ,'2007-04-18 00:00:00.000'union all
select 18 ,192 ,'2007-04-18 00:00:00.000'union all
select 19 ,193 ,'2007-04-18 00:00:00.000'union all
select 21 ,195 ,'2007-04-18 00:00:00.000'union all
select 5 ,195 ,'2007-04-17 00:00:00.000'union all
select 753 ,192 ,'2007-04-23 00:00:00.000'union all
select 755 ,193 ,'2007-04-23 00:00:00.000'union all
select 759 ,195 ,'2007-04-23 00:00:00.000'select * from tab2
create table tab2 (id int ,empno int ,empname varchar(30),indate datetime,outdate datetime)
insert into tab2
select 1 ,192 ,'刘香生', '2004-06-11 00:00:00.000', NULL union all
select 10 ,193 ,'黄桂秀', '2004-07-12 00:00:00.000', NULL union all
select 15 ,195 ,'钟小玲', '2004-09-02 00:00:00.000', NULL union all
select 66 ,240 ,'李惠清', '2006-05-26 00:00:00.000', NULL union all
select 156 ,321 ,'龙小琼', '2006-06-05 00:00:00.000','2006-12-29 00:00:00.000'
select a.*,b.empname into #b from
(select empno,empdate from tab1 union all
select empno,indate from tab2 union all
select empno,outdate from tab2 )a
inner join
(select distinct empno,empname from tab2) b on a.empno=b.empnoselect *,(select min(empdate) from #b where empno=a.empno and empdate>a.empdate ) from #b a where empdate is not null order by empno, empdate
----------------------------------------------------
empno empdate empname a
----------- ------------------------------------------------------
192 2004-06-11 00:00:00.000 刘香生 2007-04-17 00:00:00.000
192 2007-04-17 00:00:00.000 刘香生 2007-04-18 00:00:00.000
192 2007-04-18 00:00:00.000 刘香生 2007-04-23 00:00:00.000
192 2007-04-23 00:00:00.000 刘香生 NULL
193 2004-07-12 00:00:00.000 黄桂秀 2007-04-17 00:00:00.000
193 2007-04-17 00:00:00.000 黄桂秀 2007-04-18 00:00:00.000
193 2007-04-18 00:00:00.000 黄桂秀 2007-04-23 00:00:00.000
193 2007-04-23 00:00:00.000 黄桂秀 NULL
195 2004-09-02 00:00:00.000 钟小玲 2007-04-17 00:00:00.000
195 2007-04-17 00:00:00.000 钟小玲 2007-04-18 00:00:00.000
195 2007-04-18 00:00:00.000 钟小玲 2007-04-23 00:00:00.000
195 2007-04-23 00:00:00.000 钟小玲 NULL
240 2006-05-26 00:00:00.000 李惠清 2007-04-18 00:00:00.000
240 2007-04-18 00:00:00.000 李惠清 NULL
321 2006-06-05 00:00:00.000 龙小琼 2006-12-29 00:00:00.000
321 2006-12-29 00:00:00.000 龙小琼 2007-04-17 00:00:00.000
321 2007-04-17 00:00:00.000 龙小琼 NULL(所影响的行数为 17 行)
A.empno,
B.empname,
A.empdate As sdate,
IsNull(Min(C.empdate), B.outdate) As edate
From
tab1 A
Inner Join
tab2 B
On A.empno = B.empno
Left Join
tab1 C
On A.empno = C.empno And A.empdate < C.empdate
Group By A.empno, B.empname, A.empdate, B.outdate
Union
Select
A.empno,
A.empname,
A.indate As sdate,
Min(B.empdate) As edate
From
tab2 A
Inner Join
tab1 B
On A.empno = B.empno
Group By
A.empno,
A.empname,
A.indate
(id Int,
empno Int,
empdate DateTime)Create Table tab2
(id Int,
empno Int,
empname Nvarchar(10),
indate DateTime,
outdate DateTime)
Insert tab1 Select 1, 321, '2007-04-17 00:00:00.000'
Union All Select 2, 192, '2007-04-17 00:00:00.000'
Union All Select 3, 193, '2007-04-17 00:00:00.000'
Union All Select 17, 240, '2007-04-18 00:00:00.000'
Union All Select 18, 192, '2007-04-18 00:00:00.000'
Union All Select 19, 193, '2007-04-18 00:00:00.000'
Union All Select 21, 195, '2007-04-18 00:00:00.000'
Union All Select 5, 195, '2007-04-17 00:00:00.000'
Union All Select 753, 192, '2007-04-23 00:00:00.000'
Union All Select 755, 193, '2007-04-23 00:00:00.000'
Union All Select 759, 195, '2007-04-23 00:00:00.000'Insert tab2 Select 1, 192, N'刘香生 ','2004-06-11 00:00:00.000', NULL
Union All Select 10, 193, N'黄桂秀 ','2004-07-12 00:00:00.000', NULL
Union All Select 15, 195, N'钟小玲 ','2004-09-02 00:00:00.000', NULL
Union All Select 66, 240, N'李惠清', '2006-05-26 00:00:00.000', NULL
Union All Select 156, 321, N'龙小琼', '2006-06-05 00:00:00.000', '2007-12-29 00:00:00.000'
GO
Select
A.empno,
B.empname,
A.empdate As sdate,
IsNull(Min(C.empdate), B.outdate) As edate
From
tab1 A
Inner Join
tab2 B
On A.empno = B.empno
Left Join
tab1 C
On A.empno = C.empno And A.empdate < C.empdate
Group By A.empno, B.empname, A.empdate, B.outdate
Union
Select
A.empno,
A.empname,
A.indate As sdate,
Min(B.empdate) As edate
From
tab2 A
Inner Join
tab1 B
On A.empno = B.empno
Group By
A.empno,
A.empname,
A.indate
GO
Drop Table tab1, tab2
--Result
/*
empno empname sdate edate
192 刘香生 2004-06-11 00:00:00.000 2007-04-17 00:00:00.000
192 刘香生 2007-04-17 00:00:00.000 2007-04-18 00:00:00.000
192 刘香生 2007-04-18 00:00:00.000 2007-04-23 00:00:00.000
192 刘香生 2007-04-23 00:00:00.000 NULL
193 黄桂秀 2004-07-12 00:00:00.000 2007-04-17 00:00:00.000
193 黄桂秀 2007-04-17 00:00:00.000 2007-04-18 00:00:00.000
193 黄桂秀 2007-04-18 00:00:00.000 2007-04-23 00:00:00.000
193 黄桂秀 2007-04-23 00:00:00.000 NULL
195 钟小玲 2004-09-02 00:00:00.000 2007-04-17 00:00:00.000
195 钟小玲 2007-04-17 00:00:00.000 2007-04-18 00:00:00.000
195 钟小玲 2007-04-18 00:00:00.000 2007-04-23 00:00:00.000
195 钟小玲 2007-04-23 00:00:00.000 NULL
240 李惠清 2006-05-26 00:00:00.000 2007-04-18 00:00:00.000
240 李惠清 2007-04-18 00:00:00.000 NULL
321 龙小琼 2006-06-05 00:00:00.000 2007-04-17 00:00:00.000
321 龙小琼 2007-04-17 00:00:00.000 2007-12-29 00:00:00.000
*/
A.empno,
B.empname,
A.empdate As sdate,
IsNull(Min(C.empdate), B.outdate) As edate
From
(Select empno, empdate From tab1
Union All
Select empno, indate As empdate From tab2) A
Inner Join
tab2 B
On A.empno = B.empno
Left Join
tab1 C
On A.empno = C.empno And A.empdate < C.empdate
Group By A.empno, B.empname, A.empdate, B.outdate
(id Int,
empno Int,
empdate DateTime)Create Table tab2
(id Int,
empno Int,
empname Nvarchar(10),
indate DateTime,
outdate DateTime)
Insert tab1 Select 1, 321, '2007-04-17 00:00:00.000'
Union All Select 2, 192, '2007-04-17 00:00:00.000'
Union All Select 3, 193, '2007-04-17 00:00:00.000'
Union All Select 17, 240, '2007-04-18 00:00:00.000'
Union All Select 18, 192, '2007-04-18 00:00:00.000'
Union All Select 19, 193, '2007-04-18 00:00:00.000'
Union All Select 21, 195, '2007-04-18 00:00:00.000'
Union All Select 5, 195, '2007-04-17 00:00:00.000'
Union All Select 753, 192, '2007-04-23 00:00:00.000'
Union All Select 755, 193, '2007-04-23 00:00:00.000'
Union All Select 759, 195, '2007-04-23 00:00:00.000'Insert tab2 Select 1, 192, N'刘香生 ','2004-06-11 00:00:00.000', NULL
Union All Select 10, 193, N'黄桂秀 ','2004-07-12 00:00:00.000', NULL
Union All Select 15, 195, N'钟小玲 ','2004-09-02 00:00:00.000', NULL
Union All Select 66, 240, N'李惠清', '2006-05-26 00:00:00.000', NULL
Union All Select 156, 321, N'龙小琼', '2006-06-05 00:00:00.000', '2007-12-29 00:00:00.000'
GO
Select
A.empno,
B.empname,
A.empdate As sdate,
IsNull(Min(C.empdate), B.outdate) As edate
From
(Select empno, empdate From tab1
Union All
Select empno, indate As empdate From tab2) A
Inner Join
tab2 B
On A.empno = B.empno
Left Join
tab1 C
On A.empno = C.empno And A.empdate < C.empdate
Group By A.empno, B.empname, A.empdate, B.outdate
GO
Drop Table tab1, tab2
--Result
/*
empno empname sdate edate
192 刘香生 2004-06-11 00:00:00.000 2007-04-17 00:00:00.000
192 刘香生 2007-04-17 00:00:00.000 2007-04-18 00:00:00.000
192 刘香生 2007-04-18 00:00:00.000 2007-04-23 00:00:00.000
192 刘香生 2007-04-23 00:00:00.000 NULL
193 黄桂秀 2004-07-12 00:00:00.000 2007-04-17 00:00:00.000
193 黄桂秀 2007-04-17 00:00:00.000 2007-04-18 00:00:00.000
193 黄桂秀 2007-04-18 00:00:00.000 2007-04-23 00:00:00.000
193 黄桂秀 2007-04-23 00:00:00.000 NULL
195 钟小玲 2004-09-02 00:00:00.000 2007-04-17 00:00:00.000
195 钟小玲 2007-04-17 00:00:00.000 2007-04-18 00:00:00.000
195 钟小玲 2007-04-18 00:00:00.000 2007-04-23 00:00:00.000
195 钟小玲 2007-04-23 00:00:00.000 NULL
240 李惠清 2006-05-26 00:00:00.000 2007-04-18 00:00:00.000
240 李惠清 2007-04-18 00:00:00.000 NULL
321 龙小琼 2006-06-05 00:00:00.000 2007-04-17 00:00:00.000
321 龙小琼 2007-04-17 00:00:00.000 2007-12-29 00:00:00.000
*/
有點問題,
首先你得把156 321 龙小琼 2006-06-05 00:00:00.000 2006-12-29 00:00:00.000
改成:156 321 龙小琼 2006-06-05 00:00:00.000 2007-12-29 00:00:00.000
以便測試321 2006-06-05 00:00:00.000 龙小琼 2007-04-17 00:00:00.000
321 2007-04-17 00:00:00.000 龙小琼 2007-12-29 00:00:00.000
321 2007-12-29 00:00:00.000 龙小琼 NULL
對龙小琼來言如果最后這條記錄沒有的話那就正確了,2007-12-29是其離職的日期
再研究一下如果確定沒有問題了就立馬結貼
謝謝幾位了!