Sql 从AVG中删除空结果

Sql 从AVG中删除空结果,sql,aggregate-functions,Sql,Aggregate Functions,我一直在做一些关于AVG的工作。我以前的解决方案不起作用。然而,经过一些修改和帮助,它现在返回正确的结果。但是,结果会继续为代理返回空值,因为在日期范围为时,代理没有结果 我已经尝试将IS NOT NULL添加到CASE WHEN参数中,但它告诉我表达式不存在 SELECT Employee, AVG(CASE WHEN SaleDate >= '2019-01-01' AND SaleDate < '2019-04-01' THEN NewScheme END),

我一直在做一些关于AVG的工作。我以前的解决方案不起作用。然而,经过一些修改和帮助,它现在返回正确的结果。但是,结果会继续为代理返回空值,因为在日期范围为时,代理没有结果

我已经尝试将IS NOT NULL添加到CASE WHEN参数中,但它告诉我表达式不存在

SELECT Employee,
       AVG(CASE WHEN SaleDate >= '2019-01-01' AND SaleDate < '2019-04-01' THEN NewScheme END),
       AVG(CASE WHEN SaleDate >= '2019-01-04' AND SaleDate < '2019-04-07' THEN NewScheme END),
FROM Salereport
WHERE Business Area = 'Sales'
GROUP BY Employee;

当adding不为null时,我被告知表达式不存在。

像这样构建查询。将ELSE 0 End和ISNULL设置为空,以避免使平均值为空

SELECT Employee,
       AVG(ISNULL(CASE WHEN SaleDate >= '2019-01-01' AND SaleDate < '2019-04-01'
                THEN NewScheme ELSE 0 End, 0)
           END),
       AVG(ISNULL((CASE WHEN SaleDate >= '2019-01-04' AND SaleDate < '2019-04-07'
                THEN NewScheme ELSE 0 End, 0)
           END),
FROM Salereport
WHERE Business Area = 'Sales'
GROUP BY Employee;


您可以简单地添加WHERE子句,以删除两个范围内都没有销售的员工。它仍然可以在一个平均列中显示NULL,但:

SELECT Employee,
       AVG(CASE WHEN SaleDate >= '2019-01-01' AND SaleDate < '2019-04-01' THEN NewScheme END),
       AVG(CASE WHEN SaleDate >= '2019-01-04' AND SaleDate < '2019-04-07' THEN NewScheme END)
FROM Salereport
WHERE Business Area = 'Sales'
AND SaleDate >= '2019-01-01' AND SaleDate < '2019-04-07'
-- if the ranges do not overlap then list them separately and combine with "OR"
GROUP BY Employee;

您将使用哪个列?使用COALESCEAVG…,0将空值替换为0,或者在出现空结果的情况下将0更改为您希望的任何值预期的输出是什么?如果一名员工在第一个范围内没有销售,但在第二个范围内有一个或多个销售,会发生什么情况?我需要将没有指定月份平均值的员工设置为空,该情况下,AVG 1,Null,5=3。平均值1,0,5=2。我不知道为什么我在脑子里把这个复杂化了。非常感谢。平均结果中不包括空值。0是。
SELECT Employee,
       AVG(CASE WHEN SaleDate >= '2019-01-01' AND SaleDate < '2019-04-01' THEN NewScheme END),
       AVG(CASE WHEN SaleDate >= '2019-01-04' AND SaleDate < '2019-04-07' THEN NewScheme END)
FROM Salereport
WHERE Business Area = 'Sales'
AND SaleDate >= '2019-01-01' AND SaleDate < '2019-04-07'
-- if the ranges do not overlap then list them separately and combine with "OR"
GROUP BY Employee;