2013-05-22 22 views
2

我的HR項目有一個表字段:如何獲得在SQL Server中的日期範圍之間的中間/設定值2008 R2

EmpName(nvarchar(50)),LeaveType(nvarchar(10)),FromDate(datetime),ToDate(datetime) 

和下面的示例數據錄入:

EmpName LeaveType FromDate  ToDate 
AA   AL  22-May-13 28-May-13 
BB   SPL  25-May-13 31-May-13 

在報告中我想每天選擇的數據如下:

EmpName 22-May-13 23-May-13 24-May-13 25-May-13 26-May-13 27-May-13 28-May-13 29-May-13 30-May-13 31-May-13 
AA   AL   AL   AL   AL   AL   AL AL   
BB            SPL  SPL   SPL  SPL  SPL  SPL    SPL 

如何通過存儲過程在sql se rver 2008 R2? 你的幫助非常感謝。謝謝!

回答

2

試試這個:

Declare @Emp table 
(EmpName varchar(10), LeaveType varchar(10), 
FromDate date,ToDate date) 

insert into @Emp values('AA','AL','22-May-13','28-May-13') 
insert into @Emp values('BB','SPL','25-May-13','31-May-13') 

select * from @emp 

;with cte as 
(select EmpName,LeaveType, FromDate ,ToDate from @Emp 
union all 

select EmpName,LeaveType,DATEADD(dd,1,FromDate),ToDate 
from cte where FromDate<ToDate) 

select * into #demo from 
(select EmpName,LeaveType,FromDate from cte) a 



Declare @col varchar(2000) 
select @col=STUFF(
(select ',[' + cast(FromDate as varchar) + ']' from 
    (select distinct FromDate from #demo)b For XML path('')), 
1,1,'') 


print @col 

Declare @query varchar(max) 
SET @query = 
    'SELECT EmpName, ' + @col + ' 
    FROM (SELECT EmpName, LeaveType, FromDate 
      FROM #demo) a 
    PIVOT (
      MIN([LeaveType]) 
      FOR FromDate IN (' + @col + ') 
      ) AS pvt 
    ORDER BY pvt.EmpName' 


exec (@query) 


drop table #demo 
+0

謝謝。它工作完美。 – Sokea

1

該解決方案基於Dynamic PIVOT

use tempdb 
go 

if OBJECT_ID('tempdb..#tbl') is not null 
    drop table #tbl 
if OBJECT_ID('tempdb..#date') is not null 
    drop table #date 
if OBJECT_ID('tempdb..#ForPivot') is not null 
    drop table #ForPivot 

create table #tbl (EmpName varchar(100),LeaveType varchar(2), DateFrom date, DateTo date) 

insert into #tbl values ('Tom','TH','20130516','20130527'), ('Hucklberry','LT','20130507','20130520') 

create table #Date (d date) 

declare @d date='20130101' 
WHILE @d<'20140101' 
    BEGIN 
     INSERT INTO #Date values(@d) 
     set @d=dateadd(DAY,1,@d) 
    END 

SELECT t.EmpName, t.LeaveType, convert(varchar(10),d,120) d 
INTO #ForPivot 
FROM #tbl t 
    cross join #Date d 
WHERE d.d BETWEEN t.DateFrom AND t.DateTo 


declare @sql varchar(max) 
declare @select_list varchar(max) 

select @select_list=ISNULL(@select_list+',','')+'['+d+']' from #ForPivot group by d order by d 


    SET @sql = 
    'SELECT EmpName, ' + @select_list + ' 
    FROM (SELECT EmpName, LeaveType, d 
      FROM #ForPivot TS) TS 
    PIVOT (
      MIN([LeaveType]) 
      FOR d IN (' + @select_list + ') 
      ) AS pvt 
    ORDER BY pvt.EmpName 
    ' 
--select @sql 
--select @select_list 
--select * from #ForPivot 

exec (@sql) 
+0

感謝,這工作太。 – Sokea

+0

@Sokea不客氣。 –

相關問題