0

利用可能なデータ (テーブル名: 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' 

月のすべての日を列ごとに表示したい。

期待される出力は次のとおりです

6月のタイムライン

従業員麻痺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

  • 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 TW - - - - - - - - - - - TL - - - - - - - - - - - - - - - - - - - 従業員 Numb2 - - - - - - - - - - - - - - TL - - - -....etc.

スクリプトは次のとおりです。

    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);
4

1 に答える 1

0

あなたが理解するのを手伝いましょう:

まず、6 月のカレンダー データ セットを準備する必要があります。

ピボットを次のように個別に使用し、6 月の日に使用します。

  1. 旅行データ
  2. 作業データ
  3. データを残す

ピボットは個々の列でうまく機能しますこれらの 3 つのデータ セットを 1 つとして表示するには、動的クエリを使用し、ユニオンをすべて使用し、case ステートメントを使用して T-Travel days などを表示します。

于 2013-07-24T09:52:55.780 に答える