2016-08-01 67 views
1

我想从用户满意度调查中得到一些平均得分,我在这里工作。有时候某个问题的评分为0,因为我们这样做的服务没有提供,所以他们无法回答。然而,我并没有真正考虑这种情况,只有一次航班只有一次调查,这意味着我最终可能得到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; 

这是罚款,只要因为你没有1次调查 飞行。但事实证明,我们这样做:

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 

其中某些这些计数为0。鉴于我目前的查询,是否有可能这样做?如果是的话,如何?

+0

想看看表定义,但一般来讲的情况下, - 这听起来像是你应该将你的问题表加入你的答案表中,然后总结答案 –

+3

你需要一个表格,其中包含缺失问题的数据。 –

+0

我收录了一张表格图。这有帮助吗? – OmniOwl

回答

1

因为空加零的计数,这样做

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

高兴它^ h ELPS!

你可能最终必须包装在一个案件本身来处理所有的评级是零

你可能会做这样的事情

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 
+0

唉,工作。谢啦! – OmniOwl

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; 
+0

没有,这将无法正常工作,你不会知道它不会工作,因为我没有显示。在SURVEYS表中有两栏,分别是FLIGHTDATAID和ID。在这种情况下,“FLIGHTDATAID”可以有多个与之关联的ID。每个“ID”都是个人调查。该调查ID随后在表格“AnswersRating”中引用,其中,根据调查中有多少个问题,可以将“n”个评分量与其相关联。 – OmniOwl

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

我希望它能帮助,

+0

不完全正确。所有可以问的问题都放在'Questions'表中。你可以看到它在开幕文章中的图片:) – OmniOwl

相关问题