SQL选择百分比

时间:2015-03-28 20:24:33

标签: mysql 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

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

3 个答案:

答案 0 :(得分:1)

尝试这样的事情

   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

答案 1 :(得分:0)

应该没有理由两次查询相同的表。如果将用户表和外部联接与社交表一起使用,按用户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

要么在分割之前将两个术语明确地转换为浮点值。在方程中混合整数和实数时要始终注意。

答案 2 :(得分:0)

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

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

我必须在分母上加以区分,因为如果用户可以有多个订阅,那么会产生多行,如果您确定每个用户有一个订阅,则可以摆脱不同的这个查询甚至更高效