“转换值”;“好”;及;“坏的”;为了计算百分比(即,从所有记录中,80%是“好的”),使用SQL
假设我有一个样本数据集p1,其中不同的用户对4种不同类型的食物进行了评级,如下所示:“转换值”;“好”;及;“坏的”;为了计算百分比(即,从所有记录中,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 我怎样才能编写一个代码,根据好
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
")