Sql 如何知道两个计数值的算术平均值

Sql 如何知道两个计数值的算术平均值,sql,postgresql,Sql,Postgresql,我有存储信息的表格答案 | EMPLOYEE | QUESTION_ID | QUESTION_TEXT | SELECTED_OPTION_ID | SELECTED_OPTION_TEXT | |----------|-------------|------------------------|--------------------|----------------------| | Mark | 1 | Do you like soup?

我有存储信息的表格答案

| EMPLOYEE | QUESTION_ID | QUESTION_TEXT          | SELECTED_OPTION_ID | SELECTED_OPTION_TEXT |
|----------|-------------|------------------------|--------------------|----------------------|
| Mark     | 1           | Do you like soup?      | 1                  | Yes                  |
| Kate     | 1           | Do you like soup?      | 1                  | Yes                  |
| Jone     | 1           | Do you like soup?      | 2                  | No                   |
| Kim      | 1           | Do you like soup?      | 3                  | I don't know         |
| Alex     | 1           | Do you like soup?      | 2                  | No                   |
| Bond     | 1           | Do you like soup?      | 1                  | Yes                  |
| Ford     | 1           | Do you like soup?      | 3                  | I don't know         |
| Mark     | 2           | Do you like ice cream? | 2                  | No                   |
| Kate     | 2           | Do you like ice cream? | 1                  | Yes                  |
| Jone     | 2           | Do you like ice cream? | 1                  | Yes                  |
| Kim      | 2           | Do you like ice cream? | 1                  | Yes                  |
| Alex     | 2           | Do you like ice cream? | 2                  | No                   |
| Bond     | 2           | Do you like ice cream? | 1                  | Yes                  |
| Ford     | 2           | Do you like ice cream? | 3                  | I don't know         |
公式:

我可以根据上面的公式分别找到这些值。例如,值_1:

我的问题是如何通过一个sql查询正确地计算这两个值的算术平均值

换句话说,我需要找到平均值:

我很确定您需要条件聚合。我怀疑你想要:

select question_id,
       count(*) filter (where selected_option_id in (2, 3)) as num_2_3,
       avg( selected_option_id in (2, 3)::int ) as ratio_2_3
from answers
group by question_id;   

对于每个问题,这提供了2或3个答案的数量以及这些答案与所有答案的比率。

您是否在寻找下面这样的答案-

SELECT 
SUM(CASE  WHEN QUESTION_ID = 1 AND SELECTED_OPTION_TEXT  <> 'Yes' THEN 1 ELSE 0 END)
/
SUM(CASE  WHEN QUESTION_ID = 1 THEN 1 ELSE 0 END) value_1 ,
SUM(CASE  WHEN QUESTION_ID = 2 AND SELECTED_OPTION_TEXT  <> 'Yes' THEN 1 ELSE 0 END)
/
SUM(CASE  WHEN QUESTION_ID = 2 THEN 1 ELSE 0 END) value_2
FROM answers 
要获得平均值,请使用以下脚本-

SELECT (A.value_1+A.value_2)/2.0 
FROM
(
    SELECT 
    SUM(CASE  WHEN QUESTION_ID = 1 AND SELECTED_OPTION_TEXT  <> 'Yes' THEN 1 ELSE 0 END)*1.0
    /
    SUM(CASE  WHEN QUESTION_ID = 1 THEN 1 ELSE 0 END)*1.0 value_1 ,
    SUM(CASE  WHEN QUESTION_ID = 2 AND SELECTED_OPTION_TEXT  <> 'Yes' THEN 1 ELSE 0 END)*1.0
    /
    SUM(CASE  WHEN QUESTION_ID = 2 THEN 1 ELSE 0 END)*1.0 value_2
    FROM answers
)A

你可以使用条件和

select  (sum( case when QUESTION_ID = 1 AND  
        SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 1 then 1 else 0 end)::float )*100 first_question_rate,
    (sum( case when QUESTION_ID = 2 AND  
        SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 2 then 1 else 0 end)::float)*100 second_question_rate,
    (( sum( case when QUESTION_ID = 1 AND  SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 1 then 1 else 0 end)::float +
      sum( case when QUESTION_ID = 2 AND  SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 2 then 1 else 0 end) ::float)/2)*100 avg 
from answer 

算术平均值在此上下文中表示什么?换句话说,它是平均值。通常,两个平均值的算术平均值是非常无意义的实体-除非两个系列样本计数都已知,否则我们可以计算加权平均值。例如,如果一个系列包含一个样本,平均值为0,其他系列包含1000个样本,平均值为1,那么我们不能说1/2是总平均值。幸运的是,OP公式总是有相同的样本数——回答第一个问题的总人数:你能再次查看我的帖子吗?我要补充一些信息。我需要找到平均值。我现在测试了你的脚本,它在所有列中返回零。似乎发生了值的舍入。你对此有什么想法吗?回答更新。。添加*100。。但问题ID和选定选项ID列是哪种数据类型?问题ID和选定选项ID列是哪种数据类型???您确定这些列包含整数而不是字符串吗?两个列的类型都是int4.answer updated。。铸造浮点数以避免整数dvisionHello!我现在测试了你的脚本,发现了奇怪的行为。脚本在所有列中返回零。似乎发生了值的舍入。你对此有什么想法吗?@NurzhanNogerbek你能检查一下修改后的脚本吗。
SELECT (A.value_1+A.value_2)/2.0 
FROM
(
    SELECT 
    SUM(CASE  WHEN QUESTION_ID = 1 AND SELECTED_OPTION_TEXT  <> 'Yes' THEN 1 ELSE 0 END)*1.0
    /
    SUM(CASE  WHEN QUESTION_ID = 1 THEN 1 ELSE 0 END)*1.0 value_1 ,
    SUM(CASE  WHEN QUESTION_ID = 2 AND SELECTED_OPTION_TEXT  <> 'Yes' THEN 1 ELSE 0 END)*1.0
    /
    SUM(CASE  WHEN QUESTION_ID = 2 THEN 1 ELSE 0 END)*1.0 value_2
    FROM answers
)A
select  (sum( case when QUESTION_ID = 1 AND  
        SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 1 then 1 else 0 end)::float )*100 first_question_rate,
    (sum( case when QUESTION_ID = 2 AND  
        SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 2 then 1 else 0 end)::float)*100 second_question_rate,
    (( sum( case when QUESTION_ID = 1 AND  SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 1 then 1 else 0 end)::float +
      sum( case when QUESTION_ID = 2 AND  SELECTED_OPTION_ID in ( 2,3) THEN 1 else 0 end )::float /  
      sum( case when QUESTION_ID = 2 then 1 else 0 end) ::float)/2)*100 avg 
from answer