Pergunta

Deixe-me desculpas antecipadamente para a simplicidade desta pergunta (eu ouvi do podcast de Jeff e sua preocupação de que a qualidade das perguntas será "suavizado"), mas eu estou preso. Estou usando AquaData para bater o meu Informix DB. Há nuances pouco peculiares entre MS SQL e Informix SQL. Enfim, eu estou tentando fazer uma expressão aninhada simples e ele me odeia.

select 
  score,
  count(*) students,
  count(finished) finished,
  count(finished) / count(*)students   
--  round((count(finished) / count(*)students),2) 
from now_calc 
group by score
order by score

A linha com a expressão simples divisão retorna a porcentagem de pessoas que terminaram, o que exatamente o que eu quero ... Eu só preciso o resultado arredondado para 2 lugares. A linha comentada (-) não funciona. Eu tentei cada variação eu possa pensar.

* Eu não estou tentando usar linhas 5 e 6, ao mesmo tempo


Me desculpe, eu deveria ter mencionado que now_calc é uma tabela temporária e que os nomes dos campos realmente são "estudantes" e "acabado". Eu tinha-lhes chamado assim porque eu vou cuspir esses resultados em linha reta em Excel e eu queria os nomes dos campos para funcionar como cabeçalhos das colunas. Então, eu entendo o que você está dizendo e, com base nisso, eu fiz-lhe o trabalho, removendo o (*) como este:

select 
  score,
  count(students) students,
  count(finished) finished,
  round((count(finished) / count(students) * 100),2) perc
from now_calc 
group by score
order by score

Estou incluindo a consulta inteira - pode fazer mais sentido para ninguém olhando para isso. A partir de uma perspectiva de aprendizagem, é importante observar as únicas obras de contagem razão no campo 'acabado' é por causa da instrução Case que fez os valores 1 ou nulo, dependendo da avaliação da instrução Case. Se essa declaração caso não existisse, contagem 'acabado' iria produzir exatamente o mesmo resultado como 'estudantes' de contagem.

--count of cohort members and total count of all students (for reference)
select 
  cohort_yr, 
  count (*) id,
  (select count (*) id from prog_enr_rec where cohort_yr is not null and prog = 'UNDG' and cohort_yr >=1998) grand
from prog_enr_rec
where cohort_yr is not null 
and prog = 'UNDG'
and cohort_yr >=1998
group by cohort_yr
order by cohort_yr;

--cohort members from all years for population
select 
  id,  
  cohort_yr,
  cl,
  enr_date,
  prog
from prog_enr_rec
where cohort_yr is not null 
and prog = 'UNDG'
and cohort_yr >=1998
order by cohort_yr
into temp pop with no log;

--which in population are still attending (726)
select 
  pop.id, 
  'Y' fin 
from pop, stu_acad_rec
where pop.id = stu_acad_rec.id 
and pop.prog = stu_acad_rec.prog
and sess = 'FA'
and yr = 2008
and reg_hrs > 0
and stu_acad_rec.cl[1,1] <> 'P'
into temp att with no log;

--which in population graduated with either A or B deg (702)
select 
  pop.id,
  'Y' fin
from pop, ed_rec
where pop.id = ed_rec.id
and pop.prog = ed_rec.prog
and ed_rec.sch_id = 10 
and (ed_rec.deg_earn[1,1] = 'B'
or  (ed_rec.deg_earn[1,1] = 'A'
and pop.id not in (select pop.id 
           from pop, ed_rec
           where pop.id = ed_rec.id
           and pop.prog = ed_rec.prog
           and ed_rec.deg_earn[1,1] = 'B'
           and ed_rec.sch_id = 10)))
into temp grad with no log;

--combine all those that either graduated or are still attending
select * from att
union
select * from grad
into temp all_fin with no log;

--ACT scores for all students in population who have a score (inner join to eliminate null values)
--score > 50 eliminates people who have data entry errors - SAT scores in ACT field
--2270
select 
  pop.id,
  max (exam_rec.score5) score
from pop, exam_rec
where pop.id = exam_rec.id
and ctgry = 'ACT'
and score5 > 0 
and score5 < 50
group by pop.id
into temp pop_score with no log;

select 
  pop.id students,
  Case when all_fin.fin = 'Y' then 1 else null end finished,
  pop_score.score
from pop, pop_score, outer all_fin
where pop.id = all_fin.id 
and pop.id = pop_score.id
into temp now_calc with no log;

select 
  score,
  count(students) students,
  count(finished) finished,
  round((count(finished) / count(students) * 100),2) perc
from now_calc 
group by score
order by score

Obrigado!

Foi útil?

Solução

SELECT
        score,
        count(*) students,
        count(finished) finished,
        count(finished) / count(*) AS something_other_than_students,   
        round((count(finished) / count(*)),2) AS rounded_value
    FROM now_calc 
    GROUP BY score
    ORDER BY score;

Note que a saída nome da coluna 'estudantes' estava sendo repetido e também estava confundindo você. O AS I utilizado é opcional.

Eu já formalmente validada a sintaxe contra IDS, e é utilizável:

Black JL: sqlcmd -Ffixsep -d stores -xf xx.sql | sed 's/        //g'
+ create temp table now_calc(finished CHAR(1), score INTEGER, name CHAR(10) PRIMARY KEY);
+ insert into now_calc values(null, 23, 'a');
+ insert into now_calc values('y',  23, 'b');
+ insert into now_calc values('y',  23, 'h');
+ insert into now_calc values('y',  23, 'i');
+ insert into now_calc values('y',  23, 'j');
+ insert into now_calc values('y',  43, 'c');
+ insert into now_calc values(null, 23, 'd');
+ insert into now_calc values('y',  43, 'e');
+ insert into now_calc values(null, 23, 'f');
+ insert into now_calc values(null, 43, 'g');
+ SELECT
        score,
        count(*) students,
        count(finished) finished,
        count(finished) / count(*) AS something_other_than_students,
        round((count(finished) / count(*)),2) AS rounded_value
    FROM now_calc
    GROUP BY score
    ORDER BY score;
 23|       7|       4| 5.71428571428571E-01|      0.57
 43|       3|       2| 6.66666666666667E-01|      0.67
Black JL:

Eu deixei 'acabado' nulos tomar, porque a única razão para 'count (terminado) / count (*)' não retornar 1 é se 'acabado' aceita nulos - não é muito bom design da tabela, no entanto. E eu coloquei 7 linhas com pontuação 23 para obter um grande número de casas decimais (e depois mudou uma linha com pontuação 43 para gerar um segundo número com um grande número de casas decimais).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top