2013-05-31 127 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指定你的格式,所以我可以設置一些參數查詢。 –