2013-05-31 3 views
1

У меня есть таблица для посещения персонала магазина, который имеет следующие столбцы:запросов SQL Server для создания динамического персонала отчета о посещаемости

  • ID: Int, рк
  • StaffName: VARCHAR
  • НазваниеКомпания: VARCHAR
  • isPresent: VARCHAR
  • дата: дата и время

Как написать запрос, который показывает посещаемость месяца?

Например: Сформировать отчет за апрель для компании XYZ, которая должна выглядит как

StaffName  1 2 3 4 5 6 7 8 9....up to last day of month 
-------------------------------------------------------------- 
John lenon  p p p a p a a p a.... 
Bob Dylan  a a a p p p p p a.... 
Keith Moon  p p p p a p a p p.... 
+2

что вы пробовали? можете ли вы разместить свой скрипт таблицы? – vikas

+0

у меня есть некоторые данные, такие как 1 Джон Леннон хуг р 5/1/2013 2 Джон Леннон хуг р 5/2/2013 3 Боб Дилан Dyl 5/1/2013 4 Боб Дилан Dyl 5/2/2013 5 Keith Moon хуг р 5/1/2013 6 Keith Moon хуг р 5/2/2013 я хочу, чтобы сгенерировать отчет, как я hsaid в моем вопросе. – barcanoj

ответ

0

Это может быть немного сложно с помощью qynamic запросов. Для таблицы:

CREATE TABLE [dbo].[attendance](
    [id] [int] NOT NULL, 
    [StaffName] [varchar](100) NULL, 
    [CompanyName] [varchar](100) NULL, 
    [isPresent] [char](1) NULL, 
    [date] [datetime] NULL, 
    PRIMARY KEY CLUSTERED ([id] ASC) 
) 
go 

Следующий скрипт создает «стержень-совместимый» сценарий с днями как колонны

--report params 
DECLARE @month int, @year int, @lastDay int 
set @month = 1 
set @year = 2012 


-- calculations 
DECLARE @startDate datetime, @endDate datetime 
SET @startDate = convert(varchar, @year) + '-' + convert(varchar, @month) + '-1' 
set @endDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0)) 
set @lastDay = day(@endDate) --last day of month 

print('showing data from ' + convert(varchar, @startDate) + ' to ' + convert(varchar, @endDate)) 
print('original report') 
SELECT StaffName, isPresent, day([date]) as day FROM attendance 
where [date] between @startDate and @endDate 

declare @day int 
set @day = 2 


declare @days varchar(max) 
set @days = '[1]' 
WHILE (@day <= @lastDay) 
BEGIN 
    set @days = @days + ',[' + convert(varchar, @day) + ']' 
    set @day = @day + 1 
END 

-- select @days 

declare @query varchar(max) 

set @query = ' 
SELECT StaffName, ' + @days + 
' 
FROM 
(SELECT StaffName, isPresent, day(date) as day FROM attendance) AS SourceTable 
PIVOT 
(
MAX(isPresent) 
FOR day IN (' + @days + ')' + ' 
) AS PivotTable;' 

--select @query 

print('pivoted report')  
exec(@query) 
+0

Спасибо, большое спасибо. он решил мою проблему. Теперь чувствую себя хорошо. – barcanoj

0

Вы можете повернуть дату в столбце с PIVOT функциональностью (здесь быстрый и грязный, например, вы можете проверить формат даты и порядок):

SELECT StaffName, [0], [1], [2], [3], [4] and so on... 
FROM 
(SELECT StaffName, isPresent, date FROM myTable) AS SourceTable 
PIVOT 
(
MAX(isPresent) 
FOR date IN ([0], [1], [2], [3], [4] and so on...) 
) AS PivotTable; 
+0

как получить список дней из вставленных данных определенного месяца. – barcanoj

+0

@barcanoj указать свой формат, чтобы я мог установить некоторый параметрический запрос. –

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