2016-08-01 2 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; 

Какой штраф до тех пор, поскольку у вас нет только одного обследования для полет. Но получается, что мы делаем:

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... 

рад, что ч 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

Aah, который работает. Спасибо чувак! – OmniOwl

0

Попробуйте это: у вас есть RATING > 0 вне Surveys таблицы состояния, должна быть внутри, если я получил это хорошо:

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» является индивидуальным опросом. Этот идентификатор опроса затем ссылается на таблицу 'AnswersRating', в которой может быть связано количество рейтингов« n »в зависимости от того, сколько вопросов в опросе. – OmniOwl

0

Пожалуйста, проверьте следующее заявление Выберите

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

Таким образом, в списке ЗЕЬЕСТА, я использую ISNULL() для отображения безответных рейтингов вопроса до 0

Я надеюсь, что это помогает,

+0

Не совсем правильно. Все вопросы, которые могут быть заданы, помещаются в таблицу 'Questions'. Вы можете увидеть это на картинке в открытии сообщения :) – OmniOwl

Смежные вопросы