如何在条件下获得AVG in CASE?

时间:2014-03-24 21:21:06

标签: sql tsql case average

我有一个包含整数值的表。 它们可以是负数,0,正数和NULL。 我需要将NULL视为0,计算给定日期的平均值,如果平均值小于0则将0放在那里。

我的查询如下:

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语句中的双重聚合函数定义(聚合语句可能要复杂得多)?

2 个答案:

答案 0 :(得分:2)

我认为最重要的功能可以帮到你:

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

答案 1 :(得分: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