【问题标题】:Combine similar multiple rows into one将相似的多行合并为一
【发布时间】:2016-05-25 03:56:33
【问题描述】:

我有一个表格,其中包含如下所述的数据。

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。

【问题讨论】:

标签: sql sql-server sql-server-2008


【解决方案1】:

这是使用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 ║
╚══════╩══════╩══════════╩════════════════════════════╝

【讨论】:

  • 这是 SQL Server 的正确答案。不幸的是,它是如此冗长/复杂,而许多其他 DBMS 做得更好并且具有简单的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多