2013-06-04 116 views
2

我有多行,不同列值共享相同的ID。 爲e.g將多行列值分成單行

col-A col-B  col-C  col-D     Col-E 
1  12  2012-12-01 1900-12-01 2:00:00  1900-12-01 3:30:00 
2  12  2012-12-02 1900-12-01 3:00:00  1900-12-01 4:O0:00 

我想在單列獲得優選與分離器(*)

12 2012-12-01 2:00 - 3:30 * 2012-12-02 3:00 - 4:00 

爲了避免混淆 - 編輯隔板使用*而不是換行符。

+1

col-C D和E的數據類型是什麼?日期,日期時間或Varchar? – sgeddes

+2

如果此查詢由諸如.net,coldfusion,java等應用程序代碼調用,運行一個非常簡單的查詢來獲取數據並使用應用程序代碼對其進行格式化可能會更容易。 –

+1

SQL用於處理數據,而不是顯示它。在客戶端代碼中做這種事。 –

回答

3

這是消除在第二行上的一個[col-B]疼痛。以下格式的日期時間的方式,你似乎想他們:

select [col-B], 
     (convert(varchar(19), [col-C] + [col-d], 121) + ' - ' + 
     right(convert(varchar(19), [col-E], 121), 8) 
     ) col 
from t 
+1

+1 - 這裏有一個工作撥弄着它:http://sqlfiddle.com/#!3/a7827/1 – sgeddes

1

正如其他人所指出的,這種格式的真的不是數據庫的問題,但有些事您的應用程序來處理。這就是說,並感謝Gordon Linoff的轉換:

declare @TimeRanges as Table 
    ([col-A] Int Identity, [col-B] Int, [col-C] Date, [col-D] DateTime, [col-E] DateTime); 

insert into @TimeRanges ([col-B], [col-C], [col-D], [col-E]) values 
    (12, '20121201', '19001201 02:00:00', '19001201 03:30:00'), 
    (12, '20121202', '19001201 03:00:00', '19001201 04:00:00'), 
    (13, '20121219', '19001201 09:00:00', '19001201 17:00:00'); 

select * from @TimeRanges; 

select [col-A], 
    case when RN = 1 then Cast([col-B] as VarChar(10)) else '' end as [col-B], Range 
    from (
    select [col-B], Row_Number() over (partition by [col-B] order by [col-A]) as RN, 
     (Convert(VarChar(19), [col-C] + [col-D], 121) + ' - ' + 
     Right(Convert(VarChar(19), [col-E], 121), 8)) as Range 
     from @TimeRanges) as ArbitraryPlaceholder 
    order by [col-A]; 
+0

我只需要一行COL_B –

+0

@KevinPieterson的獨特價值 - 你要對齊的列與標籤或空格?這_really_不屬於數據庫。你可以使用[這裏]顯示的技術(http://stackoverflow.com/questions/9811577/summarize-the-list-into-a-comma-separated-string)將行組合成一個單一的字符串,並替換一個換行符的逗號。並添加標籤。 – HABO