2016-05-03 16 views
1

に一致する部分のテキストをグループ化:私は「時間」BYテキスト(20160426000000は時間0、20160426010000だろうGROUPにできるようにする必要がありますSQL Serverの:私のようなテーブル持っ

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 

は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 'を使用する必要がありますが、groupの' Name'は結果として返されるべきですか? –

+0

いずれかをグループ別または集約にする必要があります。 – Paparazzi

答えて

3

すべての文字列が同じフォーマットを持っているので、あなたが持っているとして、あなただけの、アパートそれらを取るとsubstringを使用してそれらを再構築することができ部分的に行われた:

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

なぜdownvote? – Mureinik

+0

これは最善の答えですが、中間から文字列のセクションを取っていない場合は、 'Substring()'の代わりに 'Left()'と 'Right()'を使う方がいいです。そうでなければ、意図は誤解を招きます。これはまた、拡張子 ".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

はい、間違いありませんが、上記のバックアップ命名フォーマットが想定されています。あなたの想定されるフォーマットを取得するには、post [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

関連する問題