2012-08-08 83 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

相关问题