如何计算 select 查询中每个组的百分比

How to calculate percentage of each group on a select query

我有下面的查询,计算每个组的出现次数

SELECT ss.year, COUNT(*) 
FROM stackexchange_question seq
INNER JOIN secondary_study ss ON seq.secondary_study_code = ss.code
WHERE (seq.evaluation LIKE 'PARTIALLY' OR  seq.evaluation LIKE 'TOTALLY')
GROUP BY ss.year
ORDER BY ss.year;

下面的另一个查询计算每个组的一部分

SELECT ss.year, COUNT(*) FROM stackexchange_question seq
INNER JOIN secondary_study ss ON seq.secondary_study_code = ss.code
WHERE (seq.evaluation LIKE 'PARTIALLY' OR  seq.evaluation LIKE 'TOTALLY') AND (seq.percentile = 90)
GROUP BY ss.year
ORDER BY ss.year;

第一个查询returns:

2008|36
2009|21

第二个returns:

2008|17
2009|11

如何将第二个查询中每个组的每个计数除以第一个查询返回的计数以获得百分比?

Ue 条件聚合。这是一个简单的方法:

SELECT ss.year, COUNT(*),
       AVG(CASE WHEN (seq.percentile = 90) THEN 1.0 ELSE 0.0 END) as ProportionAT90
FROM stackexchange_question seq INNER JOIN
     secondary_study ss
     ON seq.secondary_study_code = ss.code
WHERE seq.evaluation IN ('PARTIALLY', seq.evaluation LIKE 'TOTALLY')
GROUP BY ss.year
ORDER BY ss.year
ORDER BY ss.year;

您可以将两个查询中的 where 子句用作 case 表达式。然后统计出现的次数,一个除以另一个。

SELECT ss.year, 
1.0 * 
sum(case when (seq.evaluation LIKE 'PARTIALLY' OR  seq.evaluation LIKE 'TOTALLY') 
      AND seq.percentile = 90 then 1 else 0 end)
/ sum(case when seq.evaluation LIKE 'PARTIALLY' OR seq.evaluation LIKE 'TOTALLY' then 1 else 0 end)
as pct
FROM stackexchange_question seq
INNER JOIN secondary_study ss ON seq.secondary_study_code = ss.code
GROUP BY ss.year
ORDER BY ss.year;
select (countsTab2.cnt/countsTab1.cnt) * 100.00 as percentage,
            year
from
(SELECT ss.year, COUNT(*)  as cnt
FROM stackexchange_question seq
INNER JOIN secondary_study ss ON seq.secondary_study_code = ss.code
WHERE (seq.evaluation LIKE 'PARTIALLY' OR  seq.evaluation LIKE 'TOTALLY')
GROUP BY ss.yearORDER BY ss.year
ORDER BY ss.year) as countsTab1
inner join
(SELECT ss.year, COUNT(*)  as cnt  FROM stackexchange_question seq
INNER JOIN secondary_study ss ON seq.secondary_study_code = ss.code
WHERE (seq.evaluation LIKE 'PARTIALLY' OR  seq.evaluation LIKE 'TOTALLY') AND (seq.percentile = 90)
GROUP BY ss.year
ORDER BY ss.year) as countsTab2
on countsTab1.year = countsTab2.year