当它等于null时,如何使列输出为零?

时间:2014-07-19 00:07:39

标签: sql sql-server-2008

我有一个查询,我得到一些评级的平均值 这是正确的。

WITH row_avg_table(avg_rating,employee, approveddate) AS
(SELECT
(SELECT AVG(rating)
FROM (
VALUES (CAST(c.rating1 AS float)), (CAST(c.rating2 AS float)), (CAST(c.rating3 AS float)), 
(CAST(c.rating4 AS float)), (CAST(c.rating5 AS float)) ) AS v (rating)
WHERE v.rating > 0) avg_rating,
employee,approveddate
FROM CSEReduxResponses c)
SELECT employee,
avg(avg_rating) as average_rating
FROM row_avg_table
where month(approveddate)=2014
AND year(approveddate)=6
GROUP BY employee;

我遇到的问题是当评级1-5都为0时。 现在它给了我' null'我想在这个特殊场合展示0。 例如,我有以下数据

create table CSEReduxResponses (rating1 int, rating2 int, rating3 int, rating4 int, rating5 int,
                                approveddate datetime,employee int)

insert into CSEReduxResponses (rating1 , rating2  ,rating3 , rating4 , rating5 ,
                                approveddate, employee )
values 
(5,4,5,1,4,'2014-06-18',1),
(5,4,5,1,0,'2014-06-18',1),
(0,0,0,0,0,'2014-06-19',3);

因此,对于employee = 3 average_rating = 0

4 个答案:

答案 0 :(得分:0)

如果您使用下面的ISNULL功能

,该怎么办?
SELECT ISNULL(AVG(rating),some_default_value)

(OR)CASE条件如下

SELECT AVG(case when rating = 0 then 1 else rating end)

答案 1 :(得分:0)

使用

isnull(Rating1, 0)

coalesce(Rating1, 0)

如果Rating1null,则会将其替换为默认值0。同样地,您可以检查其他字段。 COALESCEISNULL T-SQL函数用于返回输入参数中的第一个非空表达式,但您可以找到here

之间的差异很小。

有关coalesce

的更多详情

答案 2 :(得分:0)

您遇到的问题是WHERE v.rating > 0子句。如果评级为0,那么这将不会返回任何值 - 并且无法计算任何值的平均值,从而返回null。只需删除此子句,或者如果要过滤负值,请将其更改为WHERE v.rating >= 0

如果您使用0来存储您不想影响评级的值(就像您可能从您提供的第二个示例中看到的那样),这将无效 - 您我必须改为通过输出并用0替换空值。您可以将第一个查询的结果复制到临时表/表变量中并替换

select employee, rating = isnull(t.rating, 0)
from #temptable t

或类似的东西。

答案 3 :(得分:0)

使用CTE没有任何优势。您正在使用交叉应用和值取消对非规范化表的取消。为了得到相当于unpivot命令的你使用WHERE ... IS NOT NULL但是假设你确保所有5个值都存在以避免计算中的偏差,所以我建议:

SELECT
      employee
    , AVG(isnull(rating,0)) AS avg_rating
FROM CSEReduxResponses c
      CROSS APPLY (
            VALUES (CAST(c.rating1 AS float))
            , (CAST(c.rating2 AS float))
            , (CAST(c.rating3 AS float))
            , (CAST(c.rating4 AS float))
            , (CAST(c.rating5 AS float))
            ) AS ca1 (rating)
WHERE approveddate >= '20140601'
      AND approveddate < '20140701'
GROUP BY
      employee
;

来自您的样本数据:

| EMPLOYEE | AVG_RATING |
|----------|------------|
|        1 |        3.4 |
|        3 |          0 |

请参阅:http://sqlfiddle.com/#!3/f91d9/2

另外:我鼓励你不要在数据上使用函数来促进where条件。避免数据上的函数允许使用索引。这里你只需要一个简单的日期范围(我使用了YYYYMMDD,因为它是sql server最安全的格式)。