2017-10-21 10 views
0

初心者であるため、図で説明したように結果を得るにはどうすればよいですか。私はグループ分けして結果を得ていません。お知らせ下さい。ヘルプでSQL Serverグループを指定する

enter image description here

+0

使用しているデータベース・アリ、。これは、データベースがサポートしている場合は、ピボット(Pivot)によって実行できます。また、このリンクを見てみると、一度集計するとデータを転置する方法(列に集計する)を理解するのに役立ちます。 https://www.periscopedata.com/blog/using-row-numbering-and-full-joins-to-transpose-wide-tables.html – moxin

+0

SQL Fiddleリンクを投稿すると、誰かがコードを手助けすることができます。 – moxin

+1

ユーザーのほとんどは画像の代わりに書式設定されたテキストを好むので、コード、サンプルデータ、画像として投稿しないでください。 – Sami

答えて

0

私が正しくあなたの例のデータを読んでいる場合は、それはQuery3のために、あなたはデータフリップフロップ日付のを持っているようです。私は10/20/2017のQuery3は2:03、10/21/2017は経過時間が1:48であるべきだと思います。

実際そうであれば、ここではCommon Table Expressions、集計とPIVOTの組み合わせを使用するソリューションがあります。あなたの質問にあなたが提供したサンプルデータのために働きます。他のデータ用に調整が必要な場合があります。

set nocount on 
Declare @t Table (ID int, [Date] Date, ExecutedTime varchar(10), Label Varchar(10)) 
insert into @t values 
(1,'2017-10-20','0:01:16','Query1'), 
(2,'2017-10-20','0:00:20','Query1'), 
(3,'2017-10-20','0:00:14','Query1'), 
(4,'2017-10-20','0:01:43','Query2'), 
(5,'2017-10-20','0:00:33','Query2'), 
(6,'2017-10-20','0:00:34','Query2'), 
(7,'2017-10-20','0:01:18','Query3'), 
(8,'2017-10-20','0:00:30','Query3'), 
(9,'2017-10-20','0:00:15','Query3'), 
(10,'2017-10-21','0:01:16','Query1'), 
(11,'2017-10-21','0:00:20','Query1'), 
(12,'2017-10-21','0:00:14','Query1'), 
(13,'2017-10-21','0:01:43','Query2'), 
(14,'2017-10-21','0:00:33','Query2'), 
(15,'2017-10-21','0:00:34','Query2'), 
(16,'2017-10-21','0:01:18','Query3'), 
(16,'2017-10-21','0:00:30','Query3') 
; 
With ExecutedTimeInSeconds as --Convert ExecutedTime to seconds in preparation for aggregation 
(
select 
    [Date], 
    Label, 
    datepart(hour,(convert(time,executedTime))) * 3600 + 
    datepart(minute,(convert(time,executedTime))) * 60 + 
    datepart(second,(convert(time,executedTime))) as ElapsedSeconds 
from @t 
) 
,AggregatedDataInElapsedSeconds as --Aggregate the seconds by Date and Label 
(
SELECT [Date] 
    ,Label 
    ,sum(ElapsedSeconds) AS ElapsedSeconds 
FROM ExecutedTimeInSeconds 
GROUP BY [Date] 
    ,Label 
), 
DataReadyForPivot as --Convert the aggregageted seconds back to an elapsed time 
(
SELECT [Date], Label, 
RIGHT('0' + CAST(ElapsedSeconds/3600 AS VARCHAR),2) + ':' + 
RIGHT('0' + CAST((ElapsedSeconds/60) % 60 AS VARCHAR),2) + ':' + 
RIGHT('0' + CAST(ElapsedSeconds % 60 AS VARCHAR),2) as ExecutedSum 
from AggregatedDataInElapsedSeconds 
) 
, 
PivotedData as --Pivot the data 
(
SELECT * 
FROM DataReadyForPivot 
PIVOT(MAX(ExecutedSum) FOR Label IN (
      [Query1] 
      ,[Query2] 
      ,[Query3] 
      )) AS pvt 
) 
select --add a row number as Id 
    ROW_NUMBER() over (order by [Date] desc) as Id, 
    * 
from PivotedData 


| Id | Date  | Query1 | Query2 | Query3 | 
|----|------------|----------|----------|----------| 
| 1 | 2017-10-21 | 00:01:50 | 00:02:50 | 00:01:48 | 
| 2 | 2017-10-20 | 00:01:50 | 00:02:50 | 00:02:03 | 
関連する問題