2014-03-13 35 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