Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-03-2007
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Select registros master según nº de líneas de detalle

Hola.

Win XP
Delphi 7
FireBird 1.5 enlazado con IBX

Tengo una tabla Master llamada ALUMNOS con su detalle FALTAS de disciplina.

Quiero seleccionar los alumnos que tengan un numero determinado de faltas, comprendido entre dos números cogidos de dos Edits.

Por ej. que me liste todos los alumnos con un número de faltas comprendido entre 5 y 10.

No se como hacerlo.

¿ Alguna idea o sitio donde encontrar ayuda sobre esto ?

Muchas gracias.

Un saludo.
Responder Con Cita
  #2  
Antiguo 27-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Código SQL [-]
       Select Maestro.CveAlumno, Count(*)
         From TablaMaestro As Maestro
    Left Join TablaFallas As Fallas
           On Maestro.CveAlumno = Fallas.CveAlumno
   Group By Maestro.CveAlumno
      Having Count(*) > 5 And
              Count(*) < 10
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 27-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Qué no podemos ahorrarnos el join?

Código SQL [-]
select CveAlumno, count(CveAlumno)
from Fallas
group by CveAlumno
having count(CveAlumno) between 5 and 10

// Saludos
Responder Con Cita
  #4  
Antiguo 27-03-2007
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Muchas gracias, Poliburro y Román, voy a probarlo.

Un saludo.
Responder Con Cita
  #5  
Antiguo 28-03-2007
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Me da este error:

Token Unknown -line 2, char 15 As
Código SQL [-]
  DM.IBDSAlumnos.SelectSQL.Add('Select Maestro.CODIALUMNO, Count(*)');
  DM.IBDSAlumnos.SelectSQL.Add(' From ALUMNOS As Maestro');
  DM.IBDSAlumnos.SelectSQL.Add(' Left Join FALTAS As Faltas');
  DM.IBDSAlumnos.SelectSQL.Add(' On Maestro.CODIALUMNO = Faltas.CALUMNO');
  DM.IBDSAlumnos.SelectSQL.Add(' Group By Maestro.CODIALUMNO');
  DM.IBDSAlumnos.SelectSQL.Add(' Having Count(*) between ESDE and :HASTA');

  DM.IBDSAlumnos.ParamByName('DESDE').AsInteger := StrToInt('0' + EDesde.Text);
  DM.IBDSAlumnos.ParamByName('HASTA').AsInteger := StrToInt('0' + EHasta.Text);
¿Qué está mal?

Gracias.
Responder Con Cita
  #6  
Antiguo 28-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por roman
¿Qué no podemos ahorrarnos el join?
Código SQL [-]
select CveAlumno, count(CveAlumno)
from Fallas
group by CveAlumno
having count(CveAlumno) between 5 and 10
// Saludos
Si nos lo ahorraramos que sucedería con aquellos alumnos del maestro que no tuvieran faltas? (Detalle de faltas)?. Pues estos no aparecerían. y el reporte sería erroneo, a menos que explicitamente quisieran solo a los que tienen faltas. :P

Prueba con esto amigo.

[delphi]

Código Delphi [-]
With DM.IBDSAlumnos Do
  Begin
    SelectSQL.Text := 
      '    Select Maestro.CODIALUMNO, Count(*) ' +
      '      From ALUMNOS As Maestro ' +
      ' Left Join FALTAS As Faltas   ' +
      '        On Maestro.CODIALUMNO = Faltas.CALUMNO ' + 
      '  Group By Maestro.CODIALUMNO ' +
      ' Having Count(*) between ESDE and :HASTA';
    ParamByName('DESDE').AsInteger := StrToInt('0' + EDesde.Text);
    ParamByName('HASTA').AsInteger := StrToInt('0' + EHasta.Text);
  End;

Suerte
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #7  
Antiguo 28-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por poliburro
Si nos lo ahorraramos que sucedería con aquellos alumnos del maestro que no tuvieran faltas?
Cita:
Empezado por fidel
Quiero seleccionar los alumnos que tengan un numero determinado de faltas, comprendido entre dos números


Claro que tienes razón, pero entiendo de la pregunta original que sólo interesan alumnos con faltas. Pero ciertamente, si se trata de una especie de reporte general, el join es necesario.

// Saludos
Responder Con Cita
  #8  
Antiguo 28-03-2007
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Hola:

Lo que me indicas es lo mismo que tengo pero puesto en vez de con add en varias líneas con Text en una sola línea, por lo que da el mismo error, en el As, solo que ahora está en la linea 1 Char 60 .

Lo he cambiado así
Código SQL [-]
  DM.IBDSAlumnos.SelectSQL.Add('Select ALUMNOS.CODIALUMNO, Count(*)');
  DM.IBDSAlumnos.SelectSQL.Add(' From ALUMNOS');
  DM.IBDSAlumnos.SelectSQL.Add(' Left Join FALTAS');
  DM.IBDSAlumnos.SelectSQL.Add(' On ALUMNOS.CODIALUMNO = FALTAS.CALUMNO');
  DM.IBDSAlumnos.SelectSQL.Add(' Group By ALUMNOS.CODIALUMNO');
  DM.IBDSAlumnos.SelectSQL.Add(' Having Count(*) between ESDE and :HASTA');

  DM.IBDSAlumnos.ParamByName('DESDE').AsInteger := StrToInt('0' + EDesde.Text);
  DM.IBDSAlumnos.ParamByName('HASTA').AsInteger := StrToInt('0' + EHasta.Text);

  DM.IBDSAlumnos.Open;

y ahora pasa sin error pero al abrir la tabla alumnos me da
IBDSAlumnos: campo 'NOMBRE' no encontrado.

Si en el select le añado el campo NOMBRE (Select ALUMNOS.CODIALUMNO, ALUMNOS.NOMBRE, Count(*)) me da otro error en Group By:

Invalid expression in the select list (not contained in either an agregate function or the GROUP BY clause)

Un saludo.

Última edición por fidel fecha: 28-03-2007 a las 19:50:07.
Responder Con Cita
  #9  
Antiguo 28-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Entonces pruebalo así
Código SQL [-]


 
With DM.IBDSAlumnos Do  Begin    
    SelectSQL.Text :=
      '    Select Maestro.CODIALUMNO, Count(*) ' +
      '      From ALUMNOS As Maestro ' +      ' Left Join FALTAS As Faltas   ' +
      '        On Maestro.CODIALUMNO = Faltas.CALUMNO ' +
      '  Group By Maestro.CODIALUMNO ' +
      ' Having Count(*) between ' + EDesde.Text + ' And ' + EHasta.Text;  
End;
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #10  
Antiguo 28-03-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, primero que nada me permito insistir un poco en lo del join. Si se están buscando sólo alumnos con faltas, el join hará innecesariamente más lenta la consulta.

Por otra parte, el error del campo NOMBRE, no creo que venga de cómo está puesta la consulta puesto que no hay ninguna referencia a ese campo. Más parece que la componente IBDSAlumnos tiene asignado algún campo permanente que hace referencia a ese campo.

También recomiendo a Fidel escoger nombres más indicativos para los alias, por que eso de FROM ALUMNOS AS MAESTRO, el día de mañana le va a traer un dolor de cabeza cuando intente recordar por qué los alumnos pasan a ser maestros.

// Saludos
Responder Con Cita
  #11  
Antiguo 28-03-2007
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Hola Poliburro:

Esto sigue siendo lo mismo y dando el mismo error:
error en el As de As Maestro

Código SQL [-]
With DM.IBDSAlumnos Do
  Begin
    SelectSQL.Text := ' Select Maestro.CODIALUMNO, Count(*) ' +
     ' From ALUMNOS As Maestro' +
     ' Left Join FALTAS As Faltas ' +
     ' On Maestro.CODIALUMNO = Faltas.CALUMNO ' +
     ' Group By Maestro.CODIALUMNO ' +
     ' Having Count(*) between ' + EDesde.Text + ' And ' + EHasta.Text;
  End;

Respecto a lo que dice Román, en la consulta puse: ".. alumnos con un determinado número de faltas .." y ponía que se cogen de dos edits en los culales se puede poner por ejemplo

Desde 0 hasta 0 .. para ver alumnos que no tienen faltas
desde 1 hasta 9 .. para ver alumnos que tienen faltas pero menos de 10
desde 10 hasta 9999 .. para ver alumnos que tienen más de 10 faltas

De todas formas lo que me indicas ¿en que tabla iría?, ¿en la tabla Faltas?

¿Algo así ?
Código SQL [-]
  DM.IBDSFaltas.SelectSQL.Add('select CALUMNO, count(CALUMNO)');
  DM.IBDSFaltas.SelectSQL.Add(' from FALTAS');
  DM.IBDSFaltas.SelectSQL.Add(' group by CALUMNO');
  DM.IBDSFaltas.SelectSQL.Add(' having count(CALUMNO) between ESDE and :HASTA');
Responder Con Cita
  #12  
Antiguo 29-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por fidel
Hola Poliburro:
Esto sigue siendo lo mismo y dando el mismo error:
error en el As de As Maestro
Borra el As y con eso creo que te debería funcionar

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #13  
Antiguo 30-03-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Cita:
Empezado por fidel
Hola Poliburro:

Esto sigue siendo lo mismo y dando el mismo error:
error en el As de As Maestro



Respecto a lo que dice Román, en la consulta puse: ".. alumnos con un determinado número de faltas .." y ponía que se cogen de dos edits en los culales se puede poner por ejemplo

Desde 0 hasta 0 .. para ver alumnos que no tienen faltas
desde 1 hasta 9 .. para ver alumnos que tienen faltas pero menos de 10
desde 10 hasta 9999 .. para ver alumnos que tienen más de 10 faltas
Es lo mismo por que la consulta es la correcta, por que no la pruebas en tu cliente de FireBird y ya que verifiques que funciona correctamente la pasas a delphi?.

Necesitas el join entre tu maestro y tu detalle para poder obtener las faltas de TODOS los alumnos, pues si lo haces como román te menciona, nunca te aparecerína alumnos sin faltas (Desde 0 hasta 0 .. para ver alumnos que no tienen faltas).
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #14  
Antiguo 09-04-2007
d-hugo d-hugo is offline
Miembro
 
Registrado: abr 2007
Posts: 34
Poder: 0
d-hugo Va por buen camino
El problema que yo veo es que no se especifica lo que se está contando. Yo usaría esto:
Código SQL [-]
SELECT alumnos.codialumno, COUNT(faltas.calumno) AS numfaltas
  FROM alumnos
  LEFT JOIN faltas ON alumnos.codialumno=faltas.calumno
GROUP BY alumnos.codialumno
HAVING (COUNT(faltas.calumno) BETWEEN [:desde] AND [:hasta]);

Última edición por d-hugo fecha: 09-04-2007 a las 10:29:53.
Responder Con Cita
  #15  
Antiguo 09-04-2007
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Con lo que me indicas, d-hugo, me da el error:

IBDSAlumnos: Campo 'NOMBRE' no encontrado.

Gracias.
Responder Con Cita
  #16  
Antiguo 09-04-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Este error, como te comenté antes no puede deberse a la consulta. Revisa a qué tienes enlazado el IBDSAlumnos. Si no es lo del campo permanente, quizá algún dbedit que anteriormente hubiera hecho referencia a ese campo.

// Saludos
Responder Con Cita
  #17  
Antiguo 09-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por roman
[...]por que eso de FROM ALUMNOS AS MAESTRO, el día de mañana le va a traer un dolor de cabeza cuando intente recordar por qué los alumnos pasan a ser maestros.
... Es que precisamente el día de mañana, los alumnos serán maestros

OFFTOPIC: Perdón, no me he podido resistir
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #18  
Antiguo 10-04-2007
d-hugo d-hugo is offline
Miembro
 
Registrado: abr 2007
Posts: 34
Poder: 0
d-hugo Va por buen camino
Roman tiene razón, fíjate que 'NOMBRE' no aparece por ninguna parte en la consulta. Algo tienes de más por alguna parte.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Incrementar el id del detalle en master/detail... Arturo MySQL 2 07-07-2006 19:24:09
Impresión con Bandas Master-Detalle santi33a Impresión 0 02-12-2005 13:03:37
Ejemplo Master Detalle osmar Conexión con bases de datos 2 03-03-2005 08:26:01
Trigger en master-detalle jgutti Firebird e Interbase 3 07-08-2004 01:33:58


La franja horaria es GMT +2. Ahora son las 07:57:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi