Question

Permettez-moi de m'excuser par avance pour la simplicité de cette question (j'ai entendu le podcast de Jeff et son inquiétude quant au fait que la qualité des questions sera "bourdonnée"), mais je suis coincé. J'utilise AquaData pour accéder à ma base de données Informix. Il existe des petites nuances bizarres entre MS SQL et Informix SQL. Quoi qu'il en soit, j'essaie de faire une simple expression imbriquée et elle me déteste.

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 ligne avec l'expression de division simple renvoie le pourcentage de personnes ayant terminé, ce qui correspond exactement à ce que je veux ... J'ai juste besoin que le résultat soit arrondi à 2 places. La ligne commentée (-) ne fonctionne pas. J'ai essayé toutes les variations possibles.

* Je n'essaie PAS d'utiliser les lignes 5 & amp; 6 en même temps

Je suis désolé, j'aurais dû mentionner que now_calc est une table temporaire et que les noms de champ sont en fait "étudiants". et "fini". Je les ai nommés comme cela parce que je vais cracher ces résultats directement dans Excel et je voulais que les noms de champs soient doublés en en-têtes de colonnes. Donc, je comprends ce que vous dites, et sur cette base, je l’ai fait en supprimant le (*) comme ceci:

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

J'inclus la requête dans son intégralité - cela pourrait être plus logique pour quiconque de regarder cela. Du point de vue de l’apprentissage, il est important de noter que la seule raison pour laquelle le décompte fonctionne sur le champ «terminé» est l’instruction Case qui a rendu les valeurs 1 ou nul en fonction de l’évaluation de l’instruction Case. Si cette déclaration n’existait pas, compter le nombre de personnes «finies» produirait exactement les mêmes résultats que si on comptait les «étudiants».

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

Merci!

Était-ce utile?

La solution

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;

Notez que le nom de la colonne de sortie "étudiants" était en cours de répétition et vous déroutait également. L’AS que j’ai utilisé est facultatif.

J'ai maintenant formellement validé la syntaxe par rapport à IDS, qui est utilisable:

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:

Je laisse «fini» prendre des valeurs NULL car la seule raison pour laquelle «compte (fini) / compte (*)» ne renvoie pas 1 est si «fini» accepte les valeurs NULL - la conception de la table n’est pas très bonne. Et j'ai mis 7 lignes avec le score 23 pour obtenir un grand nombre de décimales (puis j'ai changé une ligne avec le score 43 pour générer un deuxième nombre avec un grand nombre de décimales).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top