2013-06-04 2 views
2

У меня есть несколько строк с разными значениями столбцов, разделяющими один и тот же идентификатор. для напримерзначения столбцов нескольких строк в одну строку

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 

Для того, чтобы избежать путаницы - Edited разделитель использует * вместо новой строки.

+1

Каковы типы данных col-C D и E? Дата, DateTime или Varchar? – sgeddes

+2

Если этот запрос вызывается кодом приложения, таким как .net, coldfusion, java и т. Д., Может быть проще запустить очень простой запрос, который получает данные и использует код приложения для его форматирования по мере описания. –

+1

SQL предназначен для обработки данных, а не для отображения. Сделайте такой материал в клиентском коде. –

ответ

3

Это боль, чтобы устранить [col-B] на второй линии. Поддерживаются следующие форматы в DATETIME то, как вы, кажется, хотите их:

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

Как уже отмечалось другими, этот вид форматирования на самом деле не проблема базы данных, но что-то для вашего приложения для обработки. Тем не менее, и благодаря Гордону Линоффу для преобразования:

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

Смежные вопросы