пытается усреднить столбец с CAST в таблице PIVOT - неверный синтаксис рядом с '(' - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь использовать функцию Pivot, чтобы получить следующую таблицу: разбить строки TagID на столбцы, TagValue каждого TagID и DATEADD TimeStamp для отображения значений avg каждые 5 минут:

     DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT   ',' + QUOTENAME(TagID) 
                    from table
                    group by TagID
                    order by TagID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


 set @query = 'SELECT  Top (500) DATEADD(minute,DATEDIFF(minute,0,TimeStamp)/5*5,0) AS TimeStamp, ' + @cols + ' from 
             (
                select  TimeStamp, TagID , TagValue  
                from table
        Group By TimeStamp, TagID, TagValue


            ) x
            pivot 
            (
                 AVG(CAST(TagValue) AS DECIMAL(18,2))
                for TagID in ( ' + @cols + ' )

            ) p '

        execute(@query)

Я пытаюсь создать avg для столбца TagValue.

После того, как я использовал функцию CAST, как вы можете видеть выше, отобразился запрос:

Msg 102, Level 15, State 1, Line 12
Incorrect syntax near '('.

хотя я не могу найти, что неправильно и какой точный синтаксис неверен. Буду очень признателен за помощь, поскольку Management Studio не показывает, в чем проблема.

Я посмотрел онлайн и обычно функция avg используется так: AVG (TagValue), хотя он не работает для столбца NVARCHAR.

Ответы [ 3 ]

1 голос
/ 03 июня 2019

Произошла синтаксическая ошибка в операторе CAST, также были внесены незначительные изменения в таблицу подзапросов x - попробуйте следующий код

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT   ',' + QUOTENAME(TagID) 
                      FROM table
                      GROUP BY TagID
                      ORDER BY TagID
                FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')

SET @query = 'SELECT  TOP (500) DATEADD(minute,DATEDIFF(minute,0,TimeStamp)/5*5,0) AS TimeStamp, ' + @cols + ' from 
             (
                select  TimeStamp, TagID , TRY_CAST(TagValue AS DECIMAL(18,2)) AS [TagValue]
                from table
                Group By TimeStamp, TagID, TagValue
            ) x
            pivot 
            (
                AVG(TagValue)
                for TagID in ( ' + @cols + ' )
            ) p '

EXEC(@query)
0 голосов
/ 03 июня 2019

У вас проблема с синтаксисом CAST.Используйте как показано ниже -

AVG(CAST(TagValue AS DECIMAL(18,2)))

Ваш запрос показывает, что имя таблицы - «таблица».Можете ли вы использовать имя таблицы вторую скобку, как показано ниже -

FROM [table]
0 голосов
/ 03 июня 2019

Измените его на AVG(CAST(TagValue AS DECIMAL(18,2))) вместо
AVG(CAST(TagValue) AS DECIMAL(18,2)) в блоке pivot.

Т.е. вы используете CAST(TagValue) AS DECIMAL(18,2)), но оно должно быть CAST(TagValue AS DECIMAL(18,2))

...