2013-05-31 90 views
1

我有一个表来存储员工的考勤它具有以下栏目:SQL Server查询生成动态的员工考勤报告

  • ID:INT,PK
  • StaffName:VARCHAR
  • 公司名称:VARCHAR
  • isPresent:VARCHAR
  • 日期:日期时间

如何编写一个可以参加一个月的查询?

如:生成4月的报告为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

我有像 约翰一书侬XYZ p 2013年5月1日 约翰二书侬XYZ p 2013年5月2日 3鲍勃迪伦DYL一个2013年5月1日 4鲍勃迪伦DYL 5的一些数据/二千○十三分之二 5基思·穆恩XYZ p 2013年5月1日 6基思·穆恩XYZ p 2013年5月2日 我要生成报告就像我在我的问题hsaid。 – barcanoj

回答

0

这对于动态查询可能有点棘手。对于表:

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指定你的格式,所以我可以设置一些参数查询。 –