即使另一列为0,也需要包含计数

时间:2016-08-01 12:38:05

标签: sql sql-server

我正在尝试从我工作的用户满意度调查中获得一些平均分数。有时候一个问题的评分为0,因为我们所做的航班上没有提供服务,所以他们无法回答。然而,我并没有真正考虑这种情况,即航班只有一次调查,这意味着我最终可能会得到0评级。在下面,您可以看到数据库的图表:

enter image description here

这是一个问题,因为如果一项调查有13个问题而且我只得到8个问题的结果,因为5个评分为0,那么我最终得到的数据不匹配,其他所有航班都有13个问题至少回答一次(希望有意义!)

所以我曾经这样做过:

SELECT AVG(CAST(RATING AS NUMERIC(18, 2))) AS AVERAGE,
     QUESTIONID,
     COUNT(QUESTIONID) AS COUNT
FROM AnswersRating
WHERE SURVEYID IN
(
   SELECT ID
   FROM SURVEYS
   WHERE FLIGHTDATAID = 7311
) AND RATING > 0
GROUP BY QUESTIONID
ORDER BY QUESTIONID;

只要您没有一次航班调查,这是好的。但事实证明我们做到了:

AVERAGE     QUESTIONID  COUNT
3.000000    109         1
3.000000    110         1
3.000000    111         1
3.000000    112         1
3.000000    115         1
3.000000    117         1
3.000000    118         1
3.000000    120         1
3.000000    121         1

此航班没有问题113,114,116和119的答案。我知道这是因为我知道这项调查有13个问题。但调查未来可能会有不同数量的问题。所以我想要的不是上面的那个:

AVERAGE     QUESTIONID  COUNT
3.000000    109         1
3.000000    110         1
3.000000    111         1
3.000000    112         1
0.000000    113         0
0.000000    114         0
3.000000    115         1
0.000000    116         0
3.000000    117         1
3.000000    118         1
0.000000    119         0
3.000000    120         1
3.000000    121         1

其中一些上的Count为0。这是可能的,鉴于我目前的查询,如果是,如何?

3 个答案:

答案 0 :(得分:1)

因为null为计数增加零,所以执行类似

的操作
...SUM(CAST(RATING AS NUMERIC(18, 2))) / COUNT(CASE WHEN RATING > 0 THEN 1 ELSE NULL END) 
        AS TheAdjustedAverage...

很高兴有帮助!

你可能最终必须将其包装在CASE本身中以处理所有评级为零的情况

你可能会做类似

的事情
CASE WHEN COUNT(CASE WHEN RATING > 0 THEN 1 ELSE NULL END)  = 0 THEN

    NULL 

ELSE 

    SUM(CAST(RATING AS NUMERIC(18, 2))) / COUNT(CASE WHEN RATING > 0 THEN 1 ELSE NULL END) 


END AS TheAdjustedAverage

答案 1 :(得分:0)

试试这个:你在调查表条件之外有RATING > 0,如果我把它弄好的话需要在里面:

SELECT AVG(CAST(RATING AS NUMERIC(18, 2))) AS AVERAGE,
     QUESTIONID,
     COUNT(QUESTIONID) AS COUNT
FROM AnswersRating
WHERE SURVEYID IN
(
   SELECT ID
   FROM SURVEYS
   WHERE FLIGHTDATAID = 7311
   AND RATING > 0
)
GROUP BY QUESTIONID
ORDER BY QUESTIONID;

答案 2 :(得分:0)

请检查以下Select语句

SELECT AVG(CAST(ISNULL(RATING,0) AS NUMERIC(18, 2))) AS AVERAGE,
     QUESTIONID,
     COUNT(QUESTIONID) AS COUNT
FROM SurveyQuestions Q
LEFT JOIN AnswersRating A on Q.SURVEYID = A.SURVEYID
WHERE SURVEYID IN
(
   SELECT ID
   FROM SURVEYS
   WHERE FLIGHTDATAID = 7311
) --AND RATING > 0
GROUP BY QUESTIONID
ORDER BY QUESTIONID;

请注意,我假设我使用名为SurveyQuestions的表格,其中包含向用户提出的所有问题。用户可以回答或传递问题而无需回答。

通过使用LEFT JOIN到AnswersRating表,我得到了所有提供评级值的问题和没有答案的问题,所以评级为NULL

所以在SELECT列表中,我使用ISNULL()函数将未答复的问题评级映射到0

我希望它有所帮助,