2016-05-03 110 views
1

我有这样一个表部分文本分组:SQL服务器:匹配

Name       Size 
--------------------------------------  
backup_20160426000000.comp.trn 1 
backup_20160426001000.comp.trn 2 
backup_20160426002000.comp.trn 4 
(..) 
backup_20160426230000.comp.trn 4 
backup_20160426231000.comp.trn 5 

我需要能够GROUP文本BY“小时”(201604.26亿将是0小时,20160426010000是每小时1,等等。)然后总结总大小。

输出应该是:

backup_20160426000000.comp.trn 7 
(..) 
backup_20160426230000.comp.trn 9 

目前我有:

SELECT 
    SUBSTRING(dbo.CLName.NAME, PATINDEX('%2016%', dbo.CLName.NAME), 14), size 
FROM 
    dbo.CLName 
GROUP BY 
    substring(Name, 1, 15) 
+0

正在返回什么结果?你能补充一点吗? –

+0

您必须使用'GROUP BY',但组中的'Name'应该返回结果? –

+0

选择要么必须是一个或一个聚合。 – Paparazzi

回答

3

因为所有的字符串有相同的格式,你可以只把他们APPART并使用substring重建,因为你部分完成:

SELECT 
    SUBSTRING(name, 1, 15) + '0000.comp.trn', SUM(size) 
FROM 
    dbo.CLName 
GROUP BY 
    SUBSTRING(name, 1, 15) 
+1

为什么downvote? – Mureinik

+0

这是最好的答案,但如果我没有从中间取一段字符串,我更喜欢使用'Left()'和'Right()'而不是'Substring()',否则意图会误导。这也假定扩展名“.comp.trn”将始终相同,但由于作者没有指定它们可能不同,所以此答案仍然有效。 – MikeTeeVee

+0

如果字符串的格式与您提到的不完全相同,则不起作用:ex backup1_20160426000000,backup23_20160426000000,backup567_20160426000000。对这种情况有任何想法? – Cesario

0

使用SUBSTRING函数得到小时。

SELECT MIN(Name) AS Name, SUM(Size) AS Size_Sum 
FROM TblBackup 
GROUP BY SUBSTRING(Name, 16, 2) 

输出结果:

Name        Size_Sum 
-------------------------------------------- 
backup_20160426000000.comp.trn  7 
backup_20160426230000.comp.trn  9 
+0

同意符合现有数据,但我怀疑这符合实际要求。 – Paparazzi

+0

当条目名称长度不一样时,这也不起作用。例如:backup1_20160426000000,backup23_20160426000000,backup567_20160426000000 – Cesario

+0

是的,但我们假设提到的备份命名格式。为了得到你想要的格式,请按照文章[SQL只提取多个匹配数值的单个记录](http://stackoverflow.com/a/36988864/3472827) –

0

您可以将计算字段添加到表中导出的日期和时间,像这样。 (注:我已经设定分钟零,假设你是唯一的整小时感兴趣,但是这可能会改变。)

CREATE TABLE dbo.MyBackup 
(
    BackupName nvarchar(30) NOT NULL PRIMARY KEY, 
    Size int NOT NULL, 
    BackupDateTime AS CAST(SUBSTRING(BackupName, 8, 4) + N'-' + SUBSTRING(BackupName, 12, 2) + N'-' + SUBSTRING(BackupName, 14, 2) + N' ' + SUBSTRING(BackupName, 16, 2) + N':00' AS datetime2(0)) 
); 
GO 

然后添加样本数据。

INSERT INTO dbo.MyBackup (BackupName, Size) 
    VALUES (N'backup_20160426000000.comp.trn', 1), 
     (N'backup_20160426001000.comp.trn', 2), 
     (N'backup_20160426002000.comp.trn', 4), 
     (N'backup_20160426230000.comp.trn', 4), 
     (N'backup_20160426231000.comp.trn', 5); 

然后,您可以通过BackupDateTime进行选择和分组,并对大小进行求和。

SELECT BackupDateTime, SUM(Size) AS 'Size' 
    FROM dbo.MyBackup 
    GROUP BY BackupDateTime 
    ORDER BY BackupDateTime; 

enter image description here

或者当你表现出精确显示。

SELECT N'backup_' + FORMAT(YEAR(BackupDateTime), '0000') + FORMAT(MONTH(BackupDateTime), '00') + FORMAT(DAY(BackupDateTime), '00') + FORMAT(DATEPART(hour, BackupDateTime), '00') + FORMAT(DATEPART(minute, BackupDateTime), '00') + N'00.comp.trn' AS 'Name', SUM(Size) AS 'Size' 
    FROM dbo.MyBackup 
    GROUP BY BackupDateTime 
    ORDER BY BackupDateTime; 

enter image description here