MySQL - 将百分比与连接进行比较

时间:2014-08-27 00:03:49

标签: mysql left-join percentage

我有两个表(Master和标签)和以下SQL:

select t.label, m.demographic_sex, count(*) from 
Master m
LEFT OUTER JOIN tags t ON t.interaction_id = m.interaction_id
where m.demographic_sex is not null
group by t.label, m.demographic_sex
;

输出:

label           demographic_sex     count(*)
------------------------------
label_a         Female  117845
label_a         Male    45966
BOTH            Female  6476
BOTH            Male    4406
label_b         Female  364984
label_b         Male    261089

如何为每个标签计算每个性别的百分比?

2 个答案:

答案 0 :(得分:1)

您可以将其放入子查询并将总计数加入其中,然后计算平均值。

SELECT t.*, t.sex_count / t1.total_count as AVG_PER
FROM(
    select t.label, m.demographic_sex, count(*) as sex_count from 
    Master m
    LEFT OUTER JOIN tags t ON t.interaction_id = m.interaction_id
    where m.demographic_sex is not null
    group by t.label, m.demographic_sex
) t
JOIN ( 
    SELECT COUNT(*) as total_count FROM Master m
    LEFT OUTER JOIN tags t ON t.interaction_id = m.interaction_id
    where m.demographic_sex is not null
    group by m.demographic_sex
) t1 ON t1.label = t.label
    GROUP BY t.label, t.demographic_sex

如果您可以发布一些相关数据,我可以尝试并设计一个更简单的解决方案......但如果没有它我就无法测试数据。所以我不能保证结果

答案 1 :(得分:1)

你可以尝试一下吗?

SELECT t.label, m.demographic_sex, COUNT(*), COUNT(*) / total_t.total_cnt
FROM Master m LEFT OUTER JOIN tags t ON t.interaction_id = m.interaction_id
    INNER JOIN (SELECT label, COUNT(*) AS total_cnt
                FROM tags
                GROUP BY label
    ) total_t ON total_t.label = t.label
WHERE m.demographic_sex is not null
GROUP BY t.label, m.demographic_sex ;

total_t包含每个label的总计数。