使用表中的非数字数据计算SQL平均值

时间:2015-03-11 08:11:48

标签: sql sql-server group-by aggregate-functions

我有这个在这个nvarchar上失败的SQL查询,即使在我看来,它已被适当保护以使转换工作。我试图获取我只有读取权限的数据库上正确格式化数值的平均值。

select TagName, count(TagName) as Freq,
       sum(isnumeric(value)) as GoodNums,
       avg(case isnumeric(value) when 1 then cast(value as numeric) else 0 end) as "Avg",
       Min(Timestamp) as StartTime,
       Max(Timestamp) as EndTime 
 from HH_Data_9 group by TagName

但是我从来没有真正完成CASE,聚合函数和GROUP_BY组合的SQL语法,所以也许我只是写错了(在发布之前尝试过很多东西)。注意" GoodNums"专栏工作并给出了合理的答案但是当我添加" Avg"用于查询整个事物错误的列:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.

顺便说一下,这是Microsoft SQL Server 2014。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

只是想提醒一下,这种做法非常危险。请考虑以下表结构:

CREATE TABLE TestTable
    (
      FieldType NVARCHAR(50) ,
      FieldValue NVARCHAR(50)
    )
GO

INSERT  INTO dbo.TestTable
VALUES  ( 'INT', '5' ),
        ( 'INT', '15' ),
        ( 'MONEY', '5.5' )


SELECT  *
FROM    dbo.TestTable
WHERE   FieldType = 'INT'
        AND CAST(FieldValue AS INT) > 10

在我的机器上,这个查询有效,但这里的事情是许多人认为这个谓词将从左到右进行评估。但这是不正确的。 SQL Server引擎可能决定从右到左评估此表达式。在这种情况下,您将收到Conversion failed错误。它被称为ALL-AT-ONCE原则。但是在您的示例中,这不适用,但只是想提及。