SQL选择百分比



我在MySQL中有两个表容纳用户,另一个表容纳订阅。有些用户可能已签名,但他们没有订阅。我使用以下查询来获取他们没有任何订阅的用户数:

SELECT COUNT(social_users.id) FROM social_users LEFT JOIN socials
ON social_users.id = socials.social_user_id
WHERE socials.social_user_id IS NULL

上面的查询运行良好,并返回一个数字,该数字是没有任何订阅的用户数。

现在,我想得到相对于用户总数的百分比。因此,我尝试进行两次SQL查询,并将它们划分如下:

(SELECT COUNT(social_users.id) FROM social_users LEFT JOIN socials ON
social_users.id = socials.social_user_id WHERE socials.social_user_id
IS NULL) / select count(social_users.id) FROM social_users

但是,此查询不起作用。因此,我需要知道任何其他方法,允许我嵌入两个select,并将其除以,然后将结果乘以100。

尝试类似的东西

   Select ( (SELECT COUNT(social_users.id) FROM social_users LEFT JOIN socials ON
    social_users.id = socials.social_user_id WHERE socials.social_user_id
    IS NULL) / (select count(social_users.id) FROM social_users))*100 as Percentage

应该没有理由两次查询相同的表。如果您采用用户表,并通过社交表进行外部联接,按用户id分组,则可以对每个用户的订阅进行计数。那些没有订阅的用户的计数将为零。

然后将其输入到一个查询中,该查询基本上只计算零的数量,除以用户总数,et viola

SELECT  Sum( case TotalSubs when 0 then 1 else 0 end ) NonSubscribers,
        Count( user_id ) TotalUsers,
        100 * Sum( case TotalSubs when 0 then 1 else 0 end ) /
              Count( user_id ) Ratio
FROM(
    select  u.ID user_id, Count( s.ID ) TotalSubs
    from    social_users u
    left join socials     s
        ON  s.social_user_id = u.id
    group by u.id ) x;

您还希望100.0 *是比率方程式中的第一个值。考虑:

select 1 / 3 * 100.0 PostAnswer, 100.0 * 1 / 3 PreAnswer;

返回

PostAnswer  PreAnswer
       0.0   33.33333

或者在除法之前将这两项显式强制转换为浮点值。在等式中混合整数和实数时,一定要注意。

您也可以尝试以下查询。我在这里假设一个用户可以有多个订阅。这个查询的好处是在一个查询中获得百分比,因此将是更高性能的

select sum(socials.user_id is null)/count(distinct social_users.id) from social_users
left join socials on socials.user_id = social_users.id

我必须在分母上加上distinct,因为如果用户可以有多个订阅,就会导致多行,如果你确定每个用户有一个订阅,你可以去掉distinct并使这个查询更具性能

最新更新