2015-09-08 140 views
0

我有这样的表格;按日期的SQL数据透视表

enter image description here

我要显示我的数据是这样;

PersonelName------EnterDate1------EnterDate2------EnterDate3------EnterDateN 
    Michael------------6---------------8----------------7----------TotalWorkHour 
    Jason--------------5---------------8----------------6----------TotalWorkHour 
    Terra--------------6---------------6----------------6----------TotalWorkHour 
    Amelie-------------8---------------8----------------7----------TotalWorkHour 

EnterDates必须是动态的,两天之间。 我有一张人事表。

我不能形象化这个逻辑。我不能理解枢轴。请帮帮我。 谢谢你。

+0

你想要返回一个动态的列数吗?这是无法完成的,SELECT总是返回特定数量的列,与任何数据无关。 – jarlh

+0

我有一个c#项目,我可以处理日期或列名 – MehmetF

+0

如果您在某种类型的C#解决方案中呈现数据,我会尝试在代码中执行pivoting,而不是在sql中。 – larsts

回答

-1

如果你想要做一个动态的支点,你必须使用动态SQL

假设你想通过日期,而不是日期/时间转动时,SQL看起来像: -

create procedure dbo.[Personnel_Pivot](@fromDate date,@toDate date) 
as 
begin 
    SET NOCOUNT ON; 
    DECLARE @LoopDate date,@MaxDate date,@InSQL VARCHAR(max),@InSQL2 VARCHAR(max),@BigSql VARCHAR(max) 
    SELECT @MaxDate = max(enterdate),@LoopDate = min(enterdate) from [dbo].[PersonnelLog] where cast(enterdate as date) between @fromDate and @toDate 
    WHILE @LoopDate <= @MaxDate 
    BEGIN 
     SET @InSQL = COALESCE(@InSQL + ',','') + '[' + convert(varchar(10),@Loopdate,103) + ']' 
     SET @InSQL2 = COALESCE(@InSQL2 + ',','') + '[' + convert(varchar(10),@Loopdate,103)+ ']' 
     --print @i 
     set @LoopDate= (select distinct MIN(enterdate) from [dbo].[PersonnelLog] where EnterDate>@Loopdate and cast(enterdate as date) between @fromDate and @toDate) 
    END 
    --print @InSQL2 
    set @BigSql= 
    ' 
    select PersonnelID,'[email protected]+' 
    from 
     (
     select convert(varchar(10),cast(enterdate as date),103) as EnterDate,PersonnelID 
     from [dbo].[PersonnelLog] 
     ) p 
    PIVOT 
     (
     count(EnterDate) 
     for EnterDate in ('[email protected]+') 
     ) as p2 
    ' 
    --print @BigSQL 
    EXECUTE (@BigSQL) 
end 

希望你应该能够从那里得到它