将单列数据拆分为两列

时间:2014-05-14 00:55:57

标签: sql sql-server sql-server-2008

Name   time                       type
--------------------------------------------
Abc    2014-01-11 10:41:37.000    In
Abc    2014-01-11 18:12:37.000    Out
def    2014-01-07 18:25:37.000    In
def    2014-01-07 20:00:02.000    Out

如何在SQL Server中按名称和按名称拆分此数据?结果应该如下所示

Name  IN                        Out
---------------------------------------------------------
Abc   2014-01-11 10:41:37.000   2014-01-11 18:12:37.000
def   2014-01-07 18:25:37.000   2014-01-07 20:00:02.000

请帮帮我

2 个答案:

答案 0 :(得分:5)

将它们配对(进出)如何,如果这就是你需要的。然后你可以过滤“in”并始终在那之后找到最近的相应“out”。我想这里的答案可能非常复杂或非常简单,具体取决于您的数据(假设是什么以及它们有多脏)。

在以下示例中,[log]表包含您的数据。

select name,
    time as [In],
    (select top 1 time from [log] il where il.name=ol.name and il.time>ol.time order by il.time) as [Out]
from [log] ol
where type='in'

希望有所帮助。

答案 1 :(得分:0)

我想在sql server中引入pivot,开发人员通常在这些情况下使用它: http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

对于您的示例,我正在构建一个表并使用pivot来解决您的问题:

  

创建表#temp(Name varchar(10),[time] datetime,type char(3)   )

提供一些样本数据

  

插入#temp SELECT' Abc' ,' 2014-01-11 10:41:37.000',' In'   联合所有SELECT' Abc' ,' 2014-01-11 18:12:37.000',' Out'联盟   所有SELECT' def',' 2014-01-07 18:25:37.000',' In'联合所有   SELECT' def' ,' 2014-01-07 20:00:02.000',' Out'

这是透视查询

  

SELECT Name,[IN],[OUT] FROM(选择NAme,[Time],[Type] from    #temp)InnerTBL PIVOT

     

(([时间])FOR [类型]中的[[IN],[OUT]))TBL