日期:2014-05-18  浏览次数:20823 次

如何把"出勤表"的时间横放
工号   日期             时间
a       20070701       8:00
a       20070701     12:00
a       20070701     13:00
a       20070701     17:00
a       20070702       8:00
a       20070702     12:00
a       20070702     13:00
a       20070702     17:00

---如何生成以下记录
工号   日期             时间1     时间2     时间3     时间4
a       20070701       8:00     12:00     13:00     17:00
a       20070702       8:00     12:00     13:00     17:00

感谢!!!


------解决方案--------------------
--创建测试环境
Create Table 表
(工号 Char(3),
日期 Varchar(10),
时间 Varchar(5))
Insert 表 Select 'a ', '20070701 ', '8:00 '
Union All Select 'a ', '20070701 ', '12:00 '
Union All Select 'a ', '20070701 ', '13:00 '
Union All Select 'a ', '20070701 ', '17:00 '
Union All Select 'a ', '20070702 ', '8:00 '
Union All Select 'a ', '20070702 ', '12:00 '
Union All Select 'a ', '20070702 ', '13:00 '
Union All Select 'a ', '20070702 ', '17:00 '
GO
--测试
If Object_ID( 'Tempdb..#T ') Is Not Null
Drop Table #T

Select ID = Identity(Int, 1, 1), * Into #T From 表 A

Declare @S Varchar(8000)
Select @S = 'Select 工号, 日期 '
Select @S = @S + ', Max(Case OrderID When ' + Cast(OrderID As Varchar) + ' Then 时间 Else ' ' ' ' End) As 时间 ' + Cast(OrderID As Varchar)
From (Select OrderID = (Select Count(工号) From #T Where 工号 = A.工号 And 日期 = A.日期 And ID <= A.ID), * From #T A) B Group By OrderID
Select @S = @S + ' From (Select OrderID = (Select Count(工号) From #T Where 工号 = A.工号 And 日期 = A.日期 And ID <= A.ID), * From #T A) B Group By 工号, 日期 '
EXEC(@S)

Drop Table #T
GO
--删除测试环境
Drop Table 表
--结果
/*
工号 日期 时间1 时间2 时间3 时间4
a 20070701 8:00 12:00 13:00 17:00
a 20070702 8:00 12:00 13:00 17:00
*/