用于显示特定月份的相应工作日,旅行日和休假日的脚本

时间:2013-07-24 09:19:10

标签: sql-server sql-server-2005 pivot

这是可用数据(表名: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 .... 等

  • T - 表示TRAVEL天;
  • W - 表示工作日;
  • L - 代表LEAVE天;

更新于2013年7月25日

我能够获取如下所示的记录。对于表格中的那些日期,我可以填写相应的“类型”。

但是,“类型”应该根据开始日期和结束日期复制到下一个日期。

员工麻木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);

1 个答案:

答案 0 :(得分:0)

让我帮你解决一下:

首先,您需要准备6月份的日历数据集

分别使用Pivot以及6月份的日期:

  1. 旅行数据
  2. 工作数据
  3. 保留数据
  4. 数据透视表适用于各个列 为了将这3个数据集作为一个使用动态查询并使用union all 并且还使用案例陈述来出现T-Travel days等。