Вы можете использовать PIVOT, чтобы получить желаемый результат -
WITH CTE(OBJECT_NAME,AVGDuration,Date,[database])
AS
(
SELECT OBJECT_NAME,
CAST(round(avg(duration)/1000000.0,2) as numeric(36,2)) as AVGDuration,
CONVERT(VARCHAR(11), timestamp, 105) Date,
database_name
FROM [DBA].[dbo].[longrun]
GROUP BY OBJECT_NAME,CONVERT(VARCHAR(11), timestamp, 105),database_name
ORDER BY CONVERT(VARCHAR(11), timestamp, 105)
)
SELECT OBJECT_NAME,[database],[May 14 2019],[May 15 2019]
FROM
(
SELECT * FROM CTE
)A
PIVOT(
MAX(AVGDuration)
FOR Date IN([May 14 2019],[May 15 2019])
)PVT
В случае списка динамической даты, вы можете попробовать это -
DECLARE @ColumnList VARCHAR(MAX)
DECLARE @sqlCommand VARCHAR(MAX)
;WITH CTE(Date)
AS
(
SELECT DISTINCT CONVERT(VARCHAR(11), timestamp, 105) Date
FROM [DBA].[dbo].[longrun]
)
SELECT @ColumnList = STUFF((SELECT ('],[' + A.Date)
FROM CTE A
ORDER BY CAST(A.Date AS DATE)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')+']'
FROM CTE
SET @sqlCommand=
N'SELECT OBJECT_NAME,[database],'+SUBSTRING(@ColumnList,2,LEN(@ColumnList))+'
FROM
(
SELECT * FROM
(
SELECT OBJECT_NAME,
CAST(round(avg(duration)/1000000.0,2) as numeric(36,2)) as AVGDuration,
CONVERT(VARCHAR(11), timestamp, 105) Date,
database_name
FROM [DBA].[dbo].[longrun]
GROUP BY OBJECT_NAME,CONVERT(VARCHAR(11), timestamp, 105),database_name
ORDER BY CONVERT(VARCHAR(11), timestamp, 105)
)
CTE
)A
PIVOT(
MAX(AVGDuration)
FOR Date IN('+SUBSTRING(@ColumnList,2,LEN(@ColumnList))+')
)PVT'
--PRINT @sqlCommand
EXEC (@sqlCommand)