2014-03-24 73 views
1

我有一个整数值的表。 它们可能是负数,0,正数和NULL。 我需要将NULL作为0,计算给定日期的平均值,如果平均值小于0,则将0放在那里。如何在情况下获得AVG?

我的查询如下:

select 
    Id, 
    ValueDate, 
    case 
     when avg(isnull(Value, 0)) > 0 then avg(isnull(Value, 0)) 
     else 0 
    end AvgValue 
from SomeTable 
where ValueDate = @givenDate 
group by Id, ValueDate 

如何避免case语句双聚合函数定义(aggregate语句可能会更加复杂)?

+0

我敢肯定的'SQL Server'将缓存功能执行或结果您的案例中的AVG计算不会执行两次。 – gotqn

+0

如果TSQL具有标量MAX()函数,将会有一个简单的解决方案。也许你可以实现你自己的:http://stackoverflow.com/questions/124417/is-there-a-max-function-in-sql-server-that-takes-two-values-like-math-max-in -ne – Turophile

回答

1

这是一个没有建立实施任何不建,在功能的解决方案。我知道你的例子会更复杂,但是这仅仅是一个想法:

CREATE TABLE DataSource 
(
    [ID] TINYINT 
    ,[Value] INT 
) 

INSERT INTO DataSource ([ID], [Value]) 
VALUES (1, 2) 
     ,(1, 0) 
     ,(1, NULL) 
     ,(1, 98) 
     ,(1, NULL) 
     ,(2, -4) 
     ,(2, 0) 
     ,(2, 0) 
     ,(2, NULL) 

SELECT [ID] 
     ,MAX([Value]) 
FROM 
(
    SELECT [ID] 
     ,AVG(COALESCE([Value],0)) 
    FROM DataSource 
    GROUP BY [ID] 
    UNION ALL 
    SELECT DISTINCT [ID] 
       ,0 
    FROM DataSource 
) Data([ID],[Value]) 
GROUP BY [ID] 

这里是小提琴 - http://sqlfiddle.com/#!6/3d223/14

2

我认为最伟大的功能,可以帮助您:

select 
    Id, 
    ValueDate, 
    greatest(avg(isnull(Value, 0)),0) AvgValue 
from SomeTable 
where ValueDate = @givenDate 
group by Id, ValueDate 
+0

问题是关于如何处理这些案例的概念。在那里成像而不是AVG有一些函数调用。 –

+0

你能分享一个链接到'T-SQL'的'''功能最丰富的文档吗?我没有使用它,我无法找到官方的参考。 – gotqn

+0

呃。它看起来不存在...但你可以定义它。有一个例子:http://www.sqlservercentral.com/Forums/Topic489858-338-1.aspx –

相关问题