2015-02-06 99 views
-10

我有以下一组数据。需要此查询SQL Server

http://i57.tinypic.com/sn2y6a.jpg

而且我努力地在这个数据如下排序。

所以,下面是输出数据。

http://i58.tinypic.com/xptth2.jpg

1)有一个新的列结束日期。计算方法如下: 如果StartDate有一个/重复记录,则将其作为StartDate,然后下一个最接近的日期应该是EndDate。对于下一行,这个EndDate应该作为StartDate,而这个startdate的下一个应该是EndDate,它应该继续这个ID。

2)对于ID 1,我有4条记录。对于这个ID,如果FirstName有一条记录,那么应该选择它,并且应该消除Null。对于LastName甚至MiddleName也是如此。

+0

其中一个链接是错误的? – 2015-02-06 19:20:10

+0

对不起詹姆斯。它现在正确...感谢您的帮助 – SQLquery 2015-02-06 19:27:07

+1

哎这个问题肯定看起来很熟悉... http://www.sqlservercentral.com/Forums/Topic1658378-23-1.aspx – 2015-02-06 19:37:38

回答

0

数据是这样的格式,只有我可以想出这样做的方式是使用游标并将日期收集到表变量中,而将其他字段收集到正常变量中。当该行的开始日期早于先前行时,将收集的数据添加到另一个结果表变量中,并清除先前使用的变量并再次执行相同的操作。

0
select 
    ID, StartDate, 
    (select min(StartDate) from T as t2 where t2.ID = t1.ID and t2.StartDate > t1.StartDate) as EndDate, 
    (select max(FirstName) from T as t2 where t2.ID = t1.ID) as FirstName, 
    (select max(LastName) from T as t2 where t2.ID = t1.ID) as LastName, 
    (select max(MiddleName) from T as t2 where t2.ID = t1.ID) as MiddleNameName 
from T as t1 
group by ID, StartDate 

将T替换为表格的名称。您可能更愿意使用CROSS APPLY来代替它。我正在使用MAX()做一些假设。

+0

这是一个不同的“肖恩”。 – shawnt00 2015-02-09 19:25:22