SQL Server: как преобразовать отдельный элемент в строке в значения столбца - PullRequest
0 голосов
/ 25 мая 2019

Я настраиваю запрос T-SQL, который преобразует строки в столбцы, но застревает при его создании.Создал ниже операторы T-SQL, и с его помощью мне нужно преобразовать строку в столбец

SELECT 
    OBJECT_NAME,
    CAST(ROUND(AVG(duration) / 1000000.0, 2) AS NUMERIC(36, 2)) AS AVGDuration,
    CONVERT(VARCHAR(11), timestamp, 105), 
    database_name
FROM 
    [DBA].[dbo].[longrun]
GROUP BY 
    OBJECT_NAME, CONVERT(VARCHAR(11), timestamp, 105), database_name
ORDER BY 
    CONVERT(VARCHAR(11), timestamp, 105)

Текущий вывод:

OBJECT_NAME         AVGDuration     Date          database
------------------------------------------------------------
XYZ                 112.35          May 14 2019   X
sp_executesql       60.01           May 14 2019   Y
XYZ                 132.35          May 15 2019   X
sp_executesql       80.01           May 15 2019   Y

Даты должны быть преобразованы в столбец, а Datetime является динамическимзначение и оно не должно быть жестко закодировано

Ожидаемый результат:

Object Name     Database  May 14 2019   May 15 2019  
------------------------------------------------------------
XYZ             X         112.35        132.35
sp_executesql   Y          60.01         80.01

1 Ответ

1 голос
/ 25 мая 2019

Вы можете использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...