如何编写SQL查询统计价格高于$500的数据占比?
解决价格高于$500的数据占比统计问题
你的原查询问题出在**GROUP BY price**上——它会把每个不同的价格单独分组计算占比,返回的是每个价格对应的记录数在总数据中的比例,而不是你想要的「所有价格高于$500的记录占总记录的比例」。
这里有两种简单直接的正确写法:
方法1:使用CASE表达式求和
SELECT (SUM(CASE WHEN price > 500 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) AS percentage_over_500 FROM items;
SUM(CASE WHEN price > 500 THEN 1 ELSE 0 END):统计所有价格高于500的记录数量,满足条件记1,不满足记0,求和后就是符合条件的总数。- 乘以
100.0是为了确保计算时用浮点数除法,避免整数除法导致的精度丢失(比如如果用整数计算,1/2会得到0,而不是50.0)。 COUNT(*)获取表中总记录数,两者相除再乘100就得到占比百分比。
方法2:利用COUNT忽略NULL的特性
SELECT (COUNT(CASE WHEN price > 500 THEN 1 END) * 100.0 / COUNT(*)) AS percentage_over_500 FROM items;
COUNT(CASE WHEN price > 500 THEN 1 END):当价格高于500时返回1,否则返回NULL;COUNT函数会自动忽略NULL值,所以最终统计的就是符合条件的记录数。- 后续的除法逻辑和方法1一致,确保得到百分比结果。
这两种写法都不需要分组,直接对整个表进行计算,就能得到你想要的「价格高于$500的数据占比」啦。
内容的提问来源于stack exchange,提问作者Deef
相关产品推荐
相关产品推荐

