2014-03-24 112 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 –

相關問題