2014-04-28 27 views
-3

表包含以下列和數據:如何在表中只有兩列的情況下將行轉換爲列?

Id | Date
1 | 04/09/2014 13:00:00 1 | 04/10/2014 15:00:00 1 | 04/12/2014 16:00:00 1 | 04/13/2014 18:00:00 2 | 04/11/2014 13:00:00 2 | 04/12/2014 15:00:00 2 | 04/12/2014 16:00:00

我需要得到每個垂直對每個ID並將其轉換爲水平視圖,其結果應該是這樣的:

Id | Date1    | Date2 
1 | 04/09/2014 13:00:00 04/10/2014 15:00:00 
1 | 04/12/2014 16:00:00 04/13/2014 18:00:00 
2 | 04/11/2014 13:00:00 04/12/2014 15:00:00 
2 | 04/12/2014 16:00:00 NULL

有一個由於缺少一個id = 2的對,因此缺少空值。表中沒有更多列。

+0

selft聯接與行數(http://msdn.microsoft.com/de-de/library/ms186734.aspx)和一些模東西,子查詢可能是很長的路要走。讓我知道,如果這導致你的解決方案。我會嘗試拿出完整的SQL,如果這沒有幫助 – cproinger

+0

與SQL Server 2008? – user3401335

+0

sql server 2012.哪個sql應該包含row_number或子查詢? – user3580877

回答

4

SQL Fiddle

MS SQL Server 2008的架構設置

create table T 
(
    Id int, 
    Date datetime 
) 

go 

insert into T values 
(1 ,'04/09/2014 13:00:00'), 
(1 ,'04/10/2014 15:00:00'), 
(1 ,'04/12/2014 16:00:00'), 
(1 ,'04/13/2014 18:00:00'), 
(2 ,'04/11/2014 13:00:00'), 
(2 ,'04/12/2014 15:00:00'), 
(2 ,'04/12/2014 16:00:00') 

查詢1

select T.Id, 
     min(T.Date) as Date1, 
     case when count(*) = 2 then max(T.Date) end as Date2 
from (
    select T.Id, 
      T.Date, 
      (1 + row_number() over(partition by T.Id order by T.Date))/2 as rn 
    from T 
    ) as T 
group by T.Id, T.rn 
order by T.Id, T.rn 

Results

| ID |      DATE1 |      DATE2 | 
|----|------------------------------|------------------------------| 
| 1 | April, 09 2014 13:00:00+0000 | April, 10 2014 15:00:00+0000 | 
| 1 | April, 12 2014 16:00:00+0000 | April, 13 2014 18:00:00+0000 | 
| 2 | April, 11 2014 13:00:00+0000 | April, 12 2014 15:00:00+0000 | 
| 2 | April, 12 2014 16:00:00+0000 |      (null) | 
+0

謝謝你,它的工作原理,並希望即使有大量的數據,它也會工作。 – user3580877

+0

需要更新的問題的反饋 – user3580877

+4

@ user3580877你不應該真的改變這樣的問題。你現在擁有的東西根本不像你開始的。我添加了第二個答案,儘可能接近您的新需求,並猜測輸入數據。我也猜測你的預期輸出有一些錯誤。 –

1

SQL Fiddle

MS SQL Server 2008的架構設置

create table T 
(
    Id int, 
    Date datetime 
) 

go 

insert into T values 
(1 ,'04/09/2014 13:00:00'), 
(1 ,'04/10/2014 15:00:00'), 
(1 ,'04/12/2014 16:00:00'), 
(1 ,'04/13/2014 18:00:00'), 
(2 ,'04/11/2014 13:00:00'), 
(2 ,'04/12/2014 15:00:00'), 
(2 ,'04/12/2014 16:00:00') 

查詢1

select T1.Id, 
     T1.Date as Date1, 
     T3.Date2 
from T as T1 
    outer apply (
       select top(1) T2.Date 
       from T as T2 
       where T1.Date < T2.Date and 
         T1.Id = T2.Id 
       order by T2.Date 
       ) as T3(Date2) 

Results

| ID |      DATE1 |      DATE2 | 
|----|------------------------------|------------------------------| 
| 1 | April, 09 2014 13:00:00+0000 | April, 10 2014 15:00:00+0000 | 
| 1 | April, 10 2014 15:00:00+0000 | April, 12 2014 16:00:00+0000 | 
| 1 | April, 12 2014 16:00:00+0000 | April, 13 2014 18:00:00+0000 | 
| 1 | April, 13 2014 18:00:00+0000 |      (null) | 
| 2 | April, 11 2014 13:00:00+0000 | April, 12 2014 15:00:00+0000 | 
| 2 | April, 12 2014 15:00:00+0000 | April, 12 2014 16:00:00+0000 | 
| 2 | April, 12 2014 16:00:00+0000 |      (null) | 
+0

sql提供了一個錯誤'lead'不是一個公認的內置函數名稱。 – user3580877

+0

@ user3580877你不是說你使用過SQL Server 2012嗎? 'select @@ version'給你什麼? –

+0

我很抱歉這是Microsoft SQL Server 2008 R2 – user3580877

相關問題