RE: Ayuda urgente y supongo facil ( mañana entrego practicas)

From: Eduardo Gutierrez <edufissure(at)msn(dot)com>
To: <mburdman(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Ayuda urgente y supongo facil ( mañana entrego practicas)
Date: 2008-11-19 06:37:02
Message-ID: BLU144-W284ACEDADCE90617B6EFC9DC0D0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


El problema es mostrar idalumno, si hago select idalumno lo tengo que poner en el group by ya que no es una funcion de agregacion. Al separarme por idalumno, entonces solo me sale un alumno por asignatura con lo cual no puedo calcular el porcentual ( numero de alumnos con nota/ numero de alumnos de la asignatura.

Lo mas cerca de la solucion que estoy es con:

select idassignatura,nom,count (nota), (
> > count(nota)::float/numalumnes::float)*100 as "PERCENTUAL"
> > from assignatura inner join notes using(idassignatura)
> > GROUP BY nom,idassignatura,numalumnes
> > order by 1;

Pero como te digo si introduzco en el select el idalumno que me lo piden tambien lo tengo que poner en el group by-
U me sale el contador de alumne siempre a 1,

dalumne | idassignatura | nom | count | PERCENTUAL
> > ----------+---------------+----------+-------+------------------
> > 1 | 2 | EDALG | 1 | 2
> > 1 | 4 | EDI | 1 | 1.33333333333333
> > 1 | 1 | IBD | 1 | 1.66666666666667
> > 1 | 7 | prueba | 1 | 1.33333333333333
> > 2 | 2 | EDALG | 1 | 2
> > 2 | 1 | IBD | 1 | 1.66666666666667
> > 3 | 2 | EDALG | 1 | 2
> > 3 | 1 | IBD | 1 | 1.66666666666667
> > 3 | 6 | TC | 1 | 2.5
> > 4 | 2 | EDALG | 1 | 2
> > 4 | 3 | ESOFT | 1 | 3.33333333333333
> > 4 | 1 | IBD | 1 | 1.66666666666667
> > 4 | 5 | LABOSOFT | 1 | 3.33333333333333
> > 4 | 6 | TC | 1 | 2.5
> > 5 | 2 | EDALG | 1 | 2
> > 5 | 3 | ESOFT | 1 | 3.33333333333333
> > 5 | 1 | IBD | 1 | 1.66666666666667
> > 5 | 5 | LABOSOFT | 1 | 3.33333333333333
> > 5 | 7 | prueba | 1 | 1.33333333333333
> > 6 | 2 | EDALG | 1 | 2
> > 6 | 1 | IBD | 1 | 1.66666666666667
> > 6 | 5 | LABOSOFT | 1 | 3.33333333333333

> > Tengo que contar los alumnos que tienen nota ( en la tabla notes ) y
> > dividirlo por el numero de alumnos matriculados o sea
> > assignatura.numalumnes.

idassignatura | nom | count | PERCENTUAL
---------------+----------+-------+------------------
1 | IBD | 6 | 10
2 | EDALG | 6 | 12
3 | ESOFT | 2 | 6.66666666666667
4 | EDI | 1 | 1.33333333333333
5 | LABOSOFT | 3 | 10
6 | TC | 2 | 5

Deberia tener una tabla del estilo:

idalumno nombre asignatura porcentual
1 IBD 10
1 EDALG 12
.,,,,,,,,
El profesor dice que con subselects se puede hacer pero no lo veo claro.

El problema es mezclar idalumne con funciones de agregacion

Espero que me ayuden
Gracias por adelantado

> Date: Tue, 18 Nov 2008 20:39:16 -0300
> From: mburdman(at)gmail(dot)com
> To: edufissure(at)msn(dot)com
> Subject: Re: [pgsql-es-ayuda] Ayuda urgente y supongo facil ( mañana entrego practicas)
> CC: pgsql-es-ayuda(at)postgresql(dot)org
>
> No estoy seguro que sea lo que te piden porque no está claro cual es
> el resultado esperado, la única forma de mostrar los ids de un grupo
> seria separador por algo.
> Aca va un ejemplo que te puede ayudar:
>
> SELECT provincia.descripcion,
> array_to_string(ARRAY(SELECT localidad.descripcion
> FROM localidad
> WHERE localidad.provincia_id = provincia.id), ',') AS localidades
> FROM provincia
>
> Muestra las ciudades de una provincia separadas por coma.
>
> --
> Saludos
>
> On Tue, Nov 18, 2008 at 7:20 PM, Eduardo Gutierrez <edufissure(at)msn(dot)com> wrote:
> > Tengo una sencilla base de datos alumno(idalumno,nombre, edad, ciutat),
> > asignatura ( idassignatura, nombre, numalumnos) y notas ( idassignatura,
> > idalumno, nota).
> >
> > Me piden:
> >
> > 12) Obtenir el porcentaje de alumnos que tienen nota de cada asignatura. Es
> > decir, el identificador de alumno, el nombre de la asignatura y la
> > proporción entre el numero total de alumnos que tienen nota en la
> > assignatura y los que estan matriculados en cada una de ellas. Esta ultima
> > columna llamarla 'PERCENTUAL'. Ordenar el resultado por el nombre de la
> > asignatura.
> >
> > Idea:
> > select idalumne, nomassignatura,proporcion alumnos con nota en la
> > asignatura/numero de alumnos as "PERCENTUAL"
> > from notes
> > where edat IS NOT NULL
> > GROUP BY idassignatura
> > order by 1;
> >
> >
> > Casi bien me falta idalumne
> >
> > select idassignatura,nom,count (nota), (
> > count(nota)::float/numalumnes::float)*100 as "PERCENTUAL"
> > from assignatura inner join notes using(idassignatura)
> > GROUP BY nom,idassignatura,numalumnes
> > order by 1;
> > Tengo que contar los alumnos que tienen nota ( en la tabla notes ) y
> > dividirlo por el numero de alumnos matriculados o sea
> > assignatura.numalumnes.
> >
> >
> >
> >
> > idassignatura | nom | count | PERCENTUAL
> > ---------------+----------+-------+------------------
> > 1 | IBD | 6 | 10
> > 2 | EDALG | 6 | 12
> > 3 | ESOFT | 2 | 6.66666666666667
> > 4 | EDI | 1 | 1.33333333333333
> > 5 | LABOSOFT | 3 | 10
> > 6 | TC | 2 | 5
> >
> > La asignatura 1 con nombre IBD tiene 6 notas. Como tiene 60 alumnos (
> > asignatura.numalumos su porcentual es 6/60=10%
> >
> > Pero me pide tambien idalumne con lo cual si lo pongo en el group by se me
> > desordena todo.
> > Ya que solo me contara un alumno por asignatura. Asi:
> >
> > i
> >
> > Solo tengo un alumno por asignatura.
> > El problema lo tengo al mezclar funciones de agregacion con group by. El
> > profesor me ha sugerido que utilice subselects para no liarme tanto pero no
> > lo veo.
> >
> > Gracias por adelantado
> >
> > Aqui esta para hacer pruebas y eso
> > DROP TABLE Notes;
> > DROP TABLE Alumne;
> > DROP TABLE Assignatura;
> >
> >
> > CREATE TABLE Alumne (
> > Idalumne serial primary key,
> > Nom varchar(20),
> > Edat int,
> > Ciutat varchar(15)
> > );
> >
> > CREATE TABLE Assignatura (
> > Idassignatura serial,
> > Nom varchar(20),
> > NumAlumnes int,
> > PRIMARY KEY (Idassignatura)
> > );
> >
> > CREATE TABLE Notes (
> > Idalumne int,
> > Idassignatura int references Assignatura(Idassignatura),
> > Nota int,
> > PRIMARY KEY (Idalumne,Idassignatura),
> > FOREIGN KEY (Idalumne) REFERENCES Alumne(Idalumne)
> > );
> >
> > INSERT INTO Alumne (Nom,Edat,Ciutat) VALUES ('Joan',19,'Lleida');
> > INSERT INTO Alumne (Nom,Edat,Ciutat) VALUES ('Abel',18,'Manresa');
> > INSERT INTO Alumne (Nom,Edat,Ciutat) VALUES ('Teresa',20,'Barcelona');
> > INSERT INTO Alumne (Nom,Edat,Ciutat) VALUES ('Marta',18,'Lleida');
> > INSERT INTO Alumne (Nom,Edat,Ciutat) VALUES ('Juli',22,'Manresa');
> > INSERT INTO Alumne (Nom,Edat,Ciutat) VALUES ('Montse',17,'Barcelona');
> >
> > INSERT INTO Assignatura (Nom,NumAlumnes) VALUES ('IBD',60);
> > INSERT INTO Assignatura (Nom,NumAlumnes) VALUES ('EDALG',50);
> > INSERT INTO Assignatura (Nom,NumAlumnes) VALUES ('ESOFT',30);
> > INSERT INTO Assignatura (Nom,NumAlumnes) VALUES ('EDI',75);
> > INSERT INTO Assignatura (Nom,NumAlumnes) VALUES ('LABOSOFT',30);
> > INSERT INTO Assignatura (Nom,NumAlumnes) VALUES ('TC',40);
> >
> > INSERT INTO Notes VALUES (1,1,10);
> > INSERT INTO Notes VALUES (1,2,8);
> > INSERT INTO Notes VALUES (1,4,10);
> > INSERT INTO Notes VALUES (2,1,8);
> > INSERT INTO Notes VALUES (2,2,3);
> > INSERT INTO Notes VALUES (3,1,4);
> > INSERT INTO Notes VALUES (3,2,3);
> > INSERT INTO Notes VALUES (3,6,4);
> > INSERT INTO Notes VALUES (4,1,10);
> > INSERT INTO Notes VALUES (4,2,8);
> > INSERT INTO Notes VALUES (4,3,3);
> > INSERT INTO Notes VALUES (4,5,10);
> > INSERT INTO Notes VALUES (4,6,9);
> > INSERT INTO Notes VALUES (5,1,10);
> > INSERT INTO Notes VALUES (5,2,9);
> > INSERT INTO Notes VALUES (5,3,6);
> > INSERT INTO Notes VALUES (5,5,7);
> > INSERT INTO Notes VALUES (6,1,8);
> > INSERT INTO Notes VALUES (6,2,8);
> > INSERT INTO Notes VALUES (6,5,3);

_________________________________________________________________
Ahora con Internet Explorer 7, llévate gratis un guiño personalizado
http://www.vivelive.com/ieak7/

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pablo Braulio 2008-11-19 07:55:47 Re: Intentando referencias cruzadas.
Previous Message Fernando Moreno 2008-11-19 02:22:17 Re: usuarios, grupos y roles