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 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
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 20:14:18.


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