Преобразовать значения «Хорошо» и «Плохо» в логическое значение для вычисления процента (т. Е. Из всех записей 80% были «Хорошо») - с использованием SQL - PullRequest
0 голосов
/ 03 июня 2018

Допустим, у меня есть примерный набор данных, p1, где разные пользователи оценивали 4 различных типа пищи, например:

Food_ID Rating
1       Good 
1       Good
2       Good
2       Bad
1       Bad
3       Bad
3       Good
4       Bad
1       Bad
4       Good
4       Good
4       Good
2       Bad
3       Bad

Как мне написать код, который сообщит мне рейтинг приемлемостиFood_ID на основе оценок «хорошо» или «плохо»?

SELECT 
Food_ID, 
sum(Rating)/count(Rating) AS Avg_Rating

FROM p1
GROUP BY Food_ID

Очевидно, что этот код не будет работать, поскольку рейтинг - это столбец символов ... есть ли быстрый способ преобразовать его в логическое значение?Тогда возможно это могло бы?Или вообще есть более простой способ?

Спасибо!

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ:

Благодаря ответам ниже, я добился прогресса.Следующий код:

sqldf("
      SELECT food_id, 
sum(CASE WHEN rating = 'Good' THEN 1 ELSE 0 END) AS good_reviews, 
count(*) AS all_reviews, 
sum(CASE WHEN rating = 'Good' THEN 1 ELSE 0 END) / count(*) AS acceptance

FROM p1

GROUP BY food_id

  ")

, который возвращает следующий вывод:

  food_id good_reviews all_reviews acceptance
     1            2           4          0
     2            1           3          0
     3            0           3          0
     4            3           4          0

Ответы [ 4 ]

0 голосов
/ 03 июня 2018

Окончательный правильный ответ - проблема возникла из-за разделения двух целых чисел и получения нецелого результата.Спасибо @ stickybit

Окончательный рабочий код:

sqldf("
  SELECT food_id, 
sum(CASE WHEN rating = 'Good' THEN 1 ELSE 0 END) AS good_reviews, 
count(*) AS all_reviews, 
CAST(sum(CASE WHEN rating = 'Good' THEN 1 ELSE 0 END) AS Float) / CAST(count(*) AS Float)*100 AS acceptance

FROM p1
GROUP BY food_id

  ")
0 голосов
/ 03 июня 2018
SUM(CASE WHEN Rating='Good' THEN 1 ELSE 0 END AS BIT)/COUNT(*) AS numericalRating
0 голосов
/ 03 июня 2018

используйте IF

select 
   food_id, 
     sum(IF rating='good' then 1 else 0 end)/count(*) as avg_rating
 from p1
 group by food_id
0 голосов
/ 03 июня 2018
SELECT 
  food_id, 
  SUM(CASE WHEN rating = 'Good' THEN 1 ELSE 0 END) AS good_reviews, 
  COUNT(*) AS all_reviews, 
  CAST(Sum(CASE WHEN rating = 'Good' THEN 1 ELSE 0 END) AS Float) 
    / CAST(COUNT(*) AS Float) * 100 AS acceptance
FROM p1
GROUP BY food_id
...