2016-02-14 32 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的正确答案。不幸的是,它是这个冗长的/复杂的,而许多其他DBMS的做得更好,并且具有简单的功能。 – Nicarus