我有一个包含整数值的表。 它们可以是负数,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语句中的双重聚合函数定义(聚合语句可能要复杂得多)?
答案 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]