2016-08-01 66 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

相關問題