Ver Mensaje Individual
  #3 (permalink)  
Antiguo 04/12/2008, 02:43
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta que se resiste...

Cita:
Iniciado por eltodi Ver Mensaje
Buenas,

en este mi primer mensaje os solicito ayuda con una consulta que se me ha atravesado y no hay forma. Es sobre dos tablas que tienen la siguiente forma:

tabla A:
-idinscrito
-nombre
-email

tabla B:
-idcuota
-idinscrito
-cuota (corresponde al año. 2006, 2007, 2008,...)
-pagado (si o no)

tabla B seria por ej:
1 21 2006 S
2 21 2007 N
3 21 2008 N
4 14 2005 S
5 14 2006 S
6 14 2007 S
7 14 2008 N

la consulta que pretendo es para obtener la gente que tiene cuota=2008 y Pagado=N, pero ojo, que solo deban cuota=2008 ( 2007 pagada=si).....

Creo que no es tan complicada, pero llevo atrancado un rato y no hay forma..

Espero puedan ayudarme.


GRACIAS
Prueba esta consulta, pero revisa antes los nombres de los campos y demás

Código sql:
Ver original
  1. SELECT tablaA.idinscrito, tablaA.nombre, COUNT( * ) AS total
  2. FROM `tablaB`
  3. INNER JOIN tablaA ON tablaA.idinscrito= tablaB.idinscrito
  4. WHERE (tablaB.cuota = '2007'
  5. AND tablaB.pagado = 'S')
  6. OR (tablaB.cuota = '2008'
  7. AND tablaB.pagado = 'N')
  8. GROUP BY tablaB.idinscrito
  9. HAVING total =2

Te explico el método: buscas todos los que tienen pagado 2007 y sin pagar 2008. Luego agrupas por idinscrito y sacas la cuenta. Aquellos que devuelvan un total de dos, es que cumplen ambas condiciones en una sola persona. Esta es una consulta que ciertamente causa más de un problema y hace dudar a los que nos iniciamos en bases de datos sobre la bondad de una estructura relacional tal y como la hemos aprendido, porque pensamos que resultaría más fácil si los datos de los años estuvieran en un mismo registro, pero es un error entenderlo así, al menos esa es mi opinión, porque la estructura que tienes es la correcta, a pesar de esta pequeña dificultad.

Última edición por jurena; 04/12/2008 a las 03:38