2016-02-14 2 views
2

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

Name | Type | Data  | Time 
DN60 | LTE | CPU Load | 2/14/2016 7:00 
DN60 | LTE | CPU Load | 2/14/2016 8:00 
DN60 | LTE | CPU Load | 2/14/2016 9:00 

Я хочу, чтобы конечный результат был одного ряда, как показано ниже. Поскольку дата будет всегда для текущего дня, значение даты может быть проигнорировано на выходе.

Name | Type | Data  | Time 
DN60 | LTE | CPU Load | 07:00,08:00,09:00 

Как это сделать с помощью простого оператора SQL, если вообще. Я использую SQL Server 2008.

+0

Проверьте это: HTTP: //stackoverflow.com/questions/194852/concat enate-many-rows-into-a-single-text-string Вам нужно обрезать дату, отличную от поля 'Time' – Nicarus

ответ

3

Вот один из способов, используя XML PATH трюк

;with cte as 
(
SELECT * 
FROM (VALUES ('DN60','LTE','CPU Load',Cast('2/14/2016 7:00' AS DATETIME)), 
       ('DN60','LTE','CPU Load',Cast('2/14/2016 8:00' AS DATETIME)), 
       ('DN60','LTE','CPU Load',Cast('2/14/2016 9:00' AS DATETIME))) cs (NAME, Type, Data, Time) 
) 
SELECT DISTINCT a.NAME, 
       a.Type, 
       a.Data, 
       LEFT(cs.time, Len(cs.time) - 1) AS time 
FROM cte a 
     CROSS APPLY (SELECT CONVERT(VARCHAR(20), Time, 8) + ',' 
        FROM cte B 
        WHERE a.NAME = b.NAME 
          AND a.Type = b.Type 
          AND a.Data = b.Data 
        FOR XML PATH('')) cs (time) 

Результат:

╔══════╦══════╦══════════╦════════════════════════════╗ 
║ NAME ║ Type ║ Data ║   time   ║ 
╠══════╬══════╬══════════╬════════════════════════════╣ 
║ DN60 ║ LTE ║ CPU Load ║ 07:00:00,08:00:00,09:00:00 ║ 
╚══════╩══════╩══════════╩════════════════════════════╝ 
+0

Это правильный ответ для SQL Server. К сожалению, это многословное/сложное, в то время как многие другие СУБД делают это лучше и с простой функцией. – Nicarus

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