我正在尝试从我工作的用户满意度调查中获得一些平均分数。有时候一个问题的评分为0,因为我们所做的航班上没有提供服务,所以他们无法回答。然而,我并没有真正考虑这种情况,即航班只有一次调查,这意味着我最终可能会得到0评级。在下面,您可以看到数据库的图表:
这是一个问题,因为如果一项调查有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。这是可能的,鉴于我目前的查询,如果是,如何?
答案 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
我希望它有所帮助,