我有一个查询,我得到一些评级的平均值 这是正确的。
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
答案 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)
如果Rating1
为null
,则会将其替换为默认值0
。同样地,您可以检查其他字段。 COALESCE
和ISNULL
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最安全的格式)。