2012-08-08 63 views
0

我有一個請求,我不確定要處理。我正在考慮使用PIVOT,但我不確定這是否會走。從結果集的不同列中的相同列中放置數據

我有以下數據:

EmployeeA, DepartmentB, 1/10/2010 
EmployeeA, DepartmentA, 1/1/2000 
EmployeeB, DepartmentC, 1/3/2011 

他們想輸出只有已經在不同部門的員工。看起來像這樣的東西(訂單是重要的,由於日期):

EmployeeA, DepartmentA, DepartmentB 

任何幫助表示讚賞。出於某種原因,我的頭腦沒有找到一個好的解決方案。

回答

4

您可以通過對錶做一個自我JOIN,然後用PIVOT以獲得您想要的格式的數據做到這一點:

SELECT * 
FROM 
(
    SELECT t1.emp, t1.dept, t1.dt 
    FROM test t1 
    INNER JOIN test t2 
     ON t1.emp = t2.emp 
     AND t1.dept != t2.dept 
) x 
PIVOT 
(
    min(dt) 
    for dept in ([A], [B], [C], [D], [E]) 
) p 

SQL Fiddle with Demo

如果您刪除JOIN你會得到所有的記錄,但你說你只想要在多個部門中的記錄。

+0

很好用。只有一個問題。只能有兩個「部門」欄。以前和當前。 – geoffrobinson 2012-08-09 00:51:11

+0

@geoffrobinson我不確定你的意思只有兩個部門。 – Taryn 2012-08-09 01:01:04

+0

我很大程度上從你的幫助中得到了答案。我會在一秒後發佈。 – geoffrobinson 2012-08-09 01:12:14

0

這是我得到的答案,我主要根據你的工作得到答案。樞軸不起作用,因爲我不知道類別(在本例中是部門),我只能有兩個。

也許有一個更簡單的方法。我沒有使用CTE,因爲我相信這也適用於Sybase,我不認爲它支持這一點。

select Meta1.[Employee ID], 
Meta1.Department as PreviousDepartment, 
Meta2.Department as CurrentDepartment 
from 
(
SELECT t1.[First Name], t1.[Last Name], 
t1.[Employee ID], t1.Department, t1.[Hire Date], 
ROW_NUMBER() over(PARTITION by t1.[EMPLOYEE ID] order by t1.[Hire Date]) as RowNum 
FROM EMPLOYEE t1 
INNER JOIN EMPLOYEE t2 
    ON t1.[Employee ID] = t2.[Employee ID] 
    AND t1.Department != t2.Department 
) Meta1 
inner join 
(
SELECT t1.[Employee ID], t1.Department, t1.[Hire Date], 
ROW_NUMBER() over(PARTITION by t1.[EMPLOYEE ID] order by t1.[Hire Date]) as RowNum 
FROM EMPLOYEE t1 
INNER JOIN EMPLOYEE t2 
    ON t1.[Employee ID] = t2.[Employee ID] 
    AND t1.Department != t2.Department 
) Meta2 
on Meta1.[Employee ID]=Meta2.[Employee ID] 
where Meta1.RowNum=1 
and Meta2.RowNum=2 
+0

如果您事先不知道這些部門,「PIVOT」仍然可以工作。有一個動態數據透視表,可以寫看[這個答案](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query/10404455#10404455) – Taryn 2012-08-09 01:20:24

相關問題