“转换值”;“好”;及;“坏的”;为了计算百分比(即,从所有记录中,80%是“好的”),使用SQL

“转换值”;“好”;及;“坏的”;为了计算百分比(即,从所有记录中,80%是“好的”),使用SQL,sql,select,group-by,proc-sql,Sql,Select,Group By,Proc Sql,假设我有一个样本数据集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 我怎样才能编写一个代码,根据好

假设我有一个样本数据集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
我怎样才能编写一个代码,根据好的与坏的评分来告诉我食物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
如果使用

最后一个正确答案——问题源于两个整数被除并产生一个非整数结果。谢谢@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

  ")

谢谢你的回答!我发现第一部分一直计算到除以count()。如果我删除了这一部分,我只得到所有正面评价的总和,这很好。当我执行/count()时,它们在某些情况下都变为0reason@Tester_Y:由于它是整数的除法,DBMS可能会生成同样为整数的结果。尝试将除法的操作数强制转换为更合适的类型。(因为你没有标记你的DBMS,我不能给出更精确的建议。)我只是使用R,我用excel创建了数据库,并导出为CSV。也许整数就是它返回0而不是分数的原因。@stickybit你完全正确。我将id=1的所有值都更改为Good,它返回接受值1。我如何设置它以使acceptance列生成分数或百分比?对浮点进行一次转换就足够了,但在除法之前进行乘法运算时,根本不需要进行转换,例如:
100*sum(当评级为'Good'时,CASE为1,否则为0 END)/count(*)
返回整数百分比,如果需要小数位数,请使用
100.00
而不是
100
SUM(CASE WHEN Rating='Good' THEN 1 ELSE 0 END AS BIT)/COUNT(*) AS numericalRating
select 
   food_id, 
     sum(IF rating='good' then 1 else 0 end)/count(*) 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, 
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

  ")