1
私はこのレコードを複数の行の従業員のためのin/outと同じID、名前でピボットを照会する方法を持っていますか?SQL Server 2008ピボットクエリ - Datetime
あなたが好きなピボットを使用することができます私はこのレコードを複数の行の従業員のためのin/outと同じID、名前でピボットを照会する方法を持っていますか?SQL Server 2008ピボットクエリ - Datetime
あなたが好きなピボットを使用することができます:
;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()
によって生成された数値は、列の作成に役立ちます。ピボット部分に同じ列名を使用することはできません。
おかげでbruh、私はちょっとそれを微調整する必要があり、それは良いです! – Devs