2016-10-21 24 views
1

私はこのレコードを複数の行の従業員のためのin/outと同じID、名前でピボットを照会する方法を持っていますか?SQL Server 2008ピボットクエリ - Datetime

あなたが好きなピボットを使用することができます

See this image

答えて

2

;WITH dtrTable AS ( --just a test sample of your table 
SELECT * 
FROM (VALUES 
(1, 'emp1', '2016-10-20', '2016-10-20 10:00:00.000', '2016-10-20 15:00:00.000'), 
(1, 'emp1', '2016-10-20', '2016-10-20 15:30:00.000', '2016-10-20 17:00:00.000'), 
(1, 'emp1', '2016-10-20', '2016-10-20 18:30:00.000', '2016-10-20 19:00:00.000'), 
(2, 'emp2', '2016-10-20', '2016-10-20 10:00:00.000', '2016-10-20 19:00:00.000'), 
(2, 'emp2', '2016-10-20', '2016-10-20 21:00:00.000', '2016-10-20 22:00:00.000'), 
(2, 'emp2', '2016-10-21', '2016-10-20 11:00:00.000', '2016-10-20 21:00:00.000') 
) as t(empId, empName, dtrDate, dtrIn, dtrOut) 
) 

SELECT * 
FROM (
    SELECT empId, 
      empName, 
      dtrDate, 
      [Columns]+seq as [Columns], 
      [Values] 
    FROM (
     SELECT *, 
       CAST(ROW_NUMBER() OVER (PARTITION BY empId, dtrDate ORDER BY dtrIn) as nvarchar(100)) as seq 
     FROM dtrTable 
    ) as t 
    UNPIVOT (
     [Values] FOR [Columns] IN ([dtrIn],[dtrOut]) 
    ) as unpvt 
) as d 
PIVOT (
    MAX([Values]) FOR [Columns] IN ([dtrIn1],[dtrOut1],[dtrIn2],[dtrOut2],[dtrIn3],[dtrOut3]) 
) as pvt 

出力:

empId empName dtrDate  dtrIn1     dtrOut1     dtrIn2     dtrOut2     dtrIn3     dtrOut3 
1  emp1 2016-10-20 2016-10-20 10:00:00.000 2016-10-20 15:00:00.000 2016-10-20 15:30:00.000 2016-10-20 17:00:00.000 2016-10-20 18:30:00.000 2016-10-20 19:00:00.000 
2  emp2 2016-10-20 2016-10-20 10:00:00.000 2016-10-20 19:00:00.000 2016-10-20 21:00:00.000 2016-10-20 22:00:00.000 NULL     NULL 
2  emp2 2016-10-21 2016-10-20 11:00:00.000 2016-10-20 21:00:00.000 NULL     NULL     NULL     NULL  

アンピボットの部分はあなたにこのテーブルを与える:

ただ、下の画像のような

empId empName dtrDate  Columns Values 
1  emp1 2016-10-20 dtrIn1 2016-10-20 10:00:00.000 
1  emp1 2016-10-20 dtrOut1 2016-10-20 15:00:00.000 
1  emp1 2016-10-20 dtrIn2 2016-10-20 15:30:00.000 
1  emp1 2016-10-20 dtrOut2 2016-10-20 17:00:00.000 
1  emp1 2016-10-20 dtrIn3 2016-10-20 18:30:00.000 
1  emp1 2016-10-20 dtrOut3 2016-10-20 19:00:00.000 
2  emp2 2016-10-20 dtrIn1 2016-10-20 10:00:00.000 
2  emp2 2016-10-20 dtrOut1 2016-10-20 19:00:00.000 
2  emp2 2016-10-20 dtrIn2 2016-10-20 21:00:00.000 
2  emp2 2016-10-20 dtrOut2 2016-10-20 22:00:00.000 
2  emp2 2016-10-21 dtrIn1 2016-10-20 11:00:00.000 
2  emp2 2016-10-21 dtrOut1 2016-10-20 21:00:00.000 

ここでは、insとoutsに何らかの順序を与えるためにパーティション化してROW_NUMBER()を使用します。また、ROW_NUMBER()によって生成された数値は、列の作成に役立ちます。ピボット部分に同じ列名を使用することはできません。

+0

おかげでbruh、私はちょっとそれを微調整する必要があり、それは良いです! – Devs