Pregunta

Permítanme disculparme de antemano por la simplicidad de esta pregunta (escuché el podcast de Jeff y su preocupación de que la calidad de las preguntas se 'aturdirá'), pero estoy atascado. Estoy usando AquaData para golpear mi base de datos Informix. Hay pequeños matices peculiares entre MS SQL e Informix SQL. De todos modos, estoy tratando de hacer una simple expresión anidada y me odia.

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

La línea con la expresión de división simple devuelve el porcentaje de personas que terminaron, que es exactamente lo que quiero ... Solo necesito que el resultado se redondee a 2 lugares. La línea comentada (-) no funciona. He intentado todas las variaciones que puedo pensar.

* NO estoy tratando de usar las líneas 5 y amp; 6 al mismo tiempo


Lo siento, debería haber mencionado que now_calc es una tabla temporal y que los nombres de los campos en realidad son " estudiantes " y " terminado " ;. Los llamé así porque voy a escupir estos resultados directamente a Excel y quería que los nombres de los campos se doblaran como encabezados de columna. Entonces, entiendo lo que estás diciendo, y en base a eso, hice que funcionara al eliminar el (*) de esta manera:

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

Incluyo toda la consulta, puede que tenga más sentido para cualquiera que vea esto. Desde una perspectiva de aprendizaje, es importante tener en cuenta que la única razón por la que funciona el recuento en el campo 'finalizado' es la declaración del caso que hizo los valores 1 o nulos, dependiendo de la evaluación de la declaración del caso. Si esa declaración de caso no existiera, contar "terminado" produciría exactamente los mismos resultados que contar "estudiantes".

--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

¡Gracias!

¿Fue útil?

Solución

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;

Tenga en cuenta que el nombre de la columna de salida 'estudiantes' se estaba repitiendo y también le estaba confundiendo. El AS que utilicé es opcional.

Ahora he validado formalmente la sintaxis de IDS, y es utilizable:

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:

Dejo que 'terminado' tome nulos porque la única razón para 'contar (terminado) / contar (*)' para no devolver 1 es si 'terminado' acepta nulos, aunque no es un muy buen diseño de tabla. Y puse 7 filas con puntuación 23 para obtener un gran número de posiciones decimales (y luego cambié una fila con puntuación 43 para generar un segundo número con una gran cantidad de posiciones decimales).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top