2014-03-13 33 views
0

我試圖設置查詢來提取員工任期報告。我有每個員工的跟蹤信息的員工狀態表(例如-Hire日期,期限日期,工資變動等)的表看起來像這樣:SQL查找行中的數據對並將其轉換爲列

EmployeeID | Date | Event 
     1  | 1/1/99 |  1 
     2  | 1/2/99 |  1 
     1  | 1/3/99 |  2 
     1  | 1/4/99 |  1 

我用透視表,從移動臺垂直佈局水平佈局

SELECT  [FK_EmployeeID], MAX([1]) AS [Hire Date], ISNULL(MAX([2]), DATEADD(d, 1, GETDATE())) AS [Term Date] 
FROM   DT_EmployeeStatusEvents PIVOT (MAX([Date]) FOR [EventType] IN ([1], [2])) T 
GROUP BY [FK_EmployeeID] 

我得到的結果是這樣的:

EmployeeID | 1  | 2 
     1  | 1/4/99 | 1/3/99 
     2  | 1/2/99 | *null* 

不過,我碰到的問題是,我需要兩套值的每一位員工。 (我們聘請了很多重複seasonals的),我想是的列轉換爲行選擇僱用日期(1)的方式,並在第二天項日期(2)爲每一個員工是這樣的:

EmployeeID | 1  | 2 
     1  | 1/1/99 | 1/3/99 
     2  | 1/2/99 | *null* 
     1  | 1/4/99 | *null* 

這可能嗎?我看了很多PIVOT的例子,它們都顯示了一個聚合函數。

+1

難道只是比那些2個事件或更多? –

+0

還有更多的活動,但我只需要1(聘用日期)和2(學期日期)事件。我們的一些季節已經被僱傭了多個賽季。例如,在2011年,2012年和2013年春季,夏季和秋季僱用了一名IF人員,將有3對數據。 (例如-3個僱用日期和3個相關的學期日期。) – gwhenning

回答

1

的問題是,你正試圖轉動一個datetime值,所以你只限於使用任何maxmin作爲聚合函數。當你使用它們時,你只會爲每個employeeid返回一行。

爲了克服這個問題,您需要在數據分組過程中使用一些值 - 我建議使用像row_number()這樣的窗口函數。您可以創建子查詢:

select employeeid, date, event 
    , row_number() over(partition by employeeid, event 
         order by date) seq 
from DT_EmployeeStatusEvents 

請參閱SQL Fiddle with Demo。這會爲每個employeeIdevent組合創建一個唯一值。這個新號碼將被分組,所以你可以返回多行。您完整的查詢將是:

select employeeid, [1], [2] 
from 
(
    select employeeid, date, event 
    , row_number() over(partition by employeeid, event 
         order by date) seq 
    from DT_EmployeeStatusEvents 
) d 
pivot 
(
    max(date) 
    for event in ([1], [2]) 
) piv 
order by employeeid; 

SQL Fiddle with Demo

0

這應該讓你開始...

DECLARE @EMP TABLE (EMPID INT, dDATE DATETIME, EVENTTYPE INT) 
INSERT INTO @EMP 
SELECT 1,'1/1/99',1 UNION ALL 
SELECT 2,'1/2/99',1 UNION ALL 
SELECT 1,'1/3/99',2 UNION ALL 
SELECT 1,'1/4/99',1 

SELECT EMPID, HIRE, TERM 
FROM (SELECT EMPID, dDATE, 'HIRE' AS X, ROW_NUMBER() OVER(PARTITION BY EMPID, EVENTTYPE ORDER BY DDATE) AS INSTANCE FROM @EMP WHERE EVENTTYPE=1 
     UNION ALL 
     SELECT EMPID, dDATE, 'TERM' AS X, ROW_NUMBER() OVER(PARTITION BY EMPID, EVENTTYPE ORDER BY DDATE) AS INSTANCE FROM @EMP WHERE EVENTTYPE=2) DATATABLE 
PIVOT (MIN([DDATE]) 
     FOR X IN ([HIRE],[TERM])) PIVOTTABLE