这是可用数据(表名:tblAttendanceD)
的方式 EmployeeNo | Type | StartDate | EndDate
M1975012200006 | TRAVEL | 06/03/2013 | 06/03/2013
M1975040500009 | TRAVEL | 06/17/2013 | 06/17/2013
M1975012200006 | WORK | 06/04/2013 | 07/15/2013
M1975040500009 | WORK | 06/18/2013 | 09/01/2013
M1975012200006 | LEAVE | 07/17/2013 | 09/01/2013
M1975040500009 | LEAVE | 09/03/2013 | 10/15/2013
--declare temporary table to store example data
DECLARE @tblAttendanceD TABLE (EmployeeName VARCHAR(30),
EmployeeNo VARCHAR(30),
[AttendanceType VARCHAR(30), Start_Date DATETIME, End_Date DATETIME)
--insert data into temporary table
INSERT INTO @tblAttendanceD (EmployeeName, EmployeeNo, [Type] , StartDate, EndDate)
SELECT 'Dumitru', 'M1975012200006', 'TRAVEL', '06/03/2013', '06/03/2013'
UNION ALL SELECT 'Mottaghi', 'M1975040500009', 'TRAVEL', '06/17/2013',
'06/17/2013'
UNION ALL SELECT 'Alvarado', 'M1986092400012', 'TRAVEL', '06/03/2013',
'06/03/2013'
UNION ALL SELECT 'Mottaghi', 'M1975040500009', 'WORK', '06/18/2013', '09/01/2013'
UNION ALL SELECT 'Alvarado', 'M1986092400012', 'WORK', '06/04/2013', '07/15/2013'
UNION ALL SELECT 'Mottaghi', 'M1975040500009', 'LEAVE', '09/03/2013', '10/15/2013'
UNION ALL SELECT 'Alvarado', 'M1986092400012', 'LEAVE', '07/17/2013', '09/01/2013'
我希望逐列显示一个月的所有日子。
预期输出如下
员工麻木1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 M1975012200006 T W W W W W W W W W W W W W L L L L L L L L L L L L L L L L 员工Numb2 W W W W W W W W W W W W W W W L L L L L .... 等
我能够获取如下所示的记录。对于表格中的那些日期,我可以填写相应的“类型”。
但是,“类型”应该根据开始日期和结束日期复制到下一个日期。
员工麻木1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 M1975012200006 T W - - - - - - - - - - - - T L - - - - - - - - - - - - - - - - - - - - 员工Numb2 - - - - - - - - - - - - - - - - T L - - - -....等。
这是脚本:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
DECLARE @Days TABLE (DateField DATETIME)
DECLARE @CurrentDate DATETIME
DECLARE @EndDate DATETIME
DECLARE @mydate DATETIME
SET @mydate = GetDate();
SELECT @CurrentDate = DATEADD(dd,-(DAY(@mydate)-1),@mydate)
SELECT @EndDate =DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate))
WHILE @CurrentDate <= @EndDate
BEGIN
INSERT INTO @Days VALUES(@CurrentDate)
SET @CurrentDate = DateAdd(d,1,@CurrentDate)
End
SELECT @cols = STUFF((SELECT '],[' +
CAST(DAY(DateField) As varchar(10))
FROM @Days
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
--select @cols;
SELECT @query =
'SELECT *
FROM
(
SELECT EmployeeNo, AttendanceType, Day([StartDate]) As [Start_Date] FROM @tblAttendanceD WHERE ISNULL(Deleted,0)=0
) AS t
PIVOT
(
MAX([AttendanceType]
)
FOR [Start_Date] IN( ' + RIGHT(@cols, LEN(@cols) - 1) + '] )' +
' ) AS p ; ';
print @query;
execute(@query);
答案 0 :(得分:0)
让我帮你解决一下:
首先,您需要准备6月份的日历数据集
分别使用Pivot以及6月份的日期:
数据透视表适用于各个列 为了将这3个数据集作为一个使用动态查询并使用union all 并且还使用案例陈述来出现T-Travel days等。