2015-09-08 6 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#, я бы попытался сделать поворот в коде, а не в 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 

Надеюсь, вы сможете уладить его оттуда

Смежные вопросы