问题背景:
数据库:mysql
单个表:test_price。
需求:需要统计表A中price的每个值的个数,比如1的个数,2的个数,并得出每个price的所占总数的百分比。
问题思考:需要用到sql聚合.
比如:
count来计算price的个数。
sum来每个price出现的总数。
需要用到join,但是需要考虑是用cross join,还是inner join, left join.【问题核心】
可能会遇到的问题:
因为SQL聚合不能直接嵌套,有些人会用sum(count)来做,就会报错!
test_price表的数据如下:
price
1
1
2
2
3
3
3
4
4
4
4
第一步: 根据需求我们是要统计每个price的个数:所以要用到count和group by
SELECT
price,
count(price) AS price_count
FROM
test_price
GROUP BY
price
price,price_count
1 2
2 2
3 3
4 4
第二步:计算price的百分比,需要用到count表的记录总条数count(*),然后用price_count除以count(*),从而得出百分比,
这里需要考虑的就是如何才能让每个price_count都去和count(*)作比:这里就要考虑子查询和目前的结果的join关系。【核心分析】
解答如下:
SELECT
a.price, /*每个price*/
count(a.price) AS price_count, /*每个price出现的次数*/
count(a.price) / c.price_total AS price_percent /*这里求price的百分比*/
FROM
test_price a
JOIN ( /*这里需要用到cross join,因为子查询只有一条记录,不会产生笛卡尔集合*/
SELECT
count(*) AS price_total /*这里是求表的总记录数*/
FROM
test_price
) AS c
GROUP BY
a.price /*按price分组*/
解决的结果如下: