Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

consulta a mi base de datos mostrando los 3 ultimos años

Estas en el tema de consulta a mi base de datos mostrando los 3 ultimos años en el foro de Mysql en Foros del Web. hola como esta como lo dice el titulo como hago una consulta a mi base de datos mysql donde tengo un campo llamado p_año y ...
  #1 (permalink)  
Antiguo 27/05/2012, 09:02
 
Fecha de Ingreso: abril-2010
Mensajes: 151
Antigüedad: 14 años
Puntos: 1
consulta a mi base de datos mostrando los 3 ultimos años

hola como esta como lo dice el titulo como hago una consulta a mi base de datos mysql donde tengo un campo llamado p_año y he alli donde almaceno los años de cada cliente que me halla pagado pero necesito hacer un reporte donde el sistema me diga por sector quienes pagaron, el sistema me refleja el pago solo que quiero que me de un resultado no mayor de tres año con el año actual

Código MySQL:
Ver original
  1. SELECT c.id_cliente, p_ano
  2. clientes AS c
  3. LEFT JOIN pagos AS p ON p.id_cliente = c.id_cliente
  4. c.sector = '$sector'

el resultado es el siguiente

Código:
ELINOR TROMPIZ	10701473	CALVARIO	
2012  
Enero  
Febrero
Marzo
Abril
Mayo
junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre

ELINOR TROMPIZ	10701473	CALVARIO	
2011  
Enero  
Febrero
Marzo
Abril
Mayo
junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre

ELINOR TROMPIZ	10701473	CALVARIO	
2010  
Enero  
Febrero
Marzo
Abril
Mayo
junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre

ELINOR TROMPIZ	10701473	CALVARIO	
2009  
Enero  
Febrero
Marzo
Abril
Mayo
junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre

ELINOR TROMPIZ	10701473	CALVARIO	
2008
Enero  
Febrero
Marzo
Abril
Mayo
junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre
lo que quiero es 2012, 2011, 2010 siempre los tres ultimos años empezando por el actual
  #2 (permalink)  
Antiguo 27/05/2012, 09:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: consulta a mi base de datos mostrando los 3 ultimos años

No se entiende mucho qué problema tiens, si ya tienes un campo dedicado al año. Simplemente sería poner la condición adecuada en el WHERE para que únicamente devuelva los registros quesean de este año y los dos precedentes.
de todos modos, para poder darte una solución primero necesitaríamos saber cómo es la estructura de la tabla (el CREATE TABLE), porque lo que muestras es insuficiente para saber cómo son los datos con que se cuenta.

De todos modos, no queda claro si lo que deseas es que la consulta devuelva el reporte tal y como lo estás mostrando, porque eso requeriría una serie de consultas con UNION y no una única consulta simple.

¿Podrías postear el CREATE TABLE?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 27/05/2012, 11:17
 
Fecha de Ingreso: abril-2010
Mensajes: 151
Antigüedad: 14 años
Puntos: 1
Respuesta: consulta a mi base de datos mostrando los 3 ultimos años

ok aqui esta la tabla clientes

Código SQL:
Ver original
  1. CREATE TABLE `clientes` (
  2. `id_cliente`  INT(11) NOT NULL AUTO_INCREMENT ,
  3. `nombres_apellidos`  VARCHAR(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  4. `cedula_cliente`  INT(11) NOT NULL ,
  5. `tipo_cliente`  VARCHAR(30) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  6. `parroquia_cliente`  VARCHAR(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  7. `sector`  VARCHAR(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  8. `calle`  VARCHAR(150) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  9. `telefono_ofic`  VARCHAR(12) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  10. `telefono_movil`  VARCHAR(12) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  11. PRIMARY KEY (`id_cliente`)
  12. )
  13. ENGINE=InnoDB
  14. DEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ci
  15. AUTO_INCREMENT=3596
  16. ROW_FORMAT=COMPACT
  17. ;
ok aqui esta la tabla clientes ok aqui esta la tabla clientes


aca la tabla pagos en donde p_mese esta serializado de esta forma
Cita:
a:12:{i:0;s:1:"1";i:1;s:1:"1";i:2;s:1:"1";i:3;s:1: "1";i:4;s:1:"1";i:5;s:1:"1";i:6;s:1:"1";i:7;s:1:"1 ";i:8;s:1:"1";i:9;s:1:"1";i:10;s:1:"1";i:11;s:1:"1 ";}

Código MySQL:
Ver original
  1. CREATE TABLE `pagos` (
  2. `id_pago`  int(11) NOT NULL AUTO_INCREMENT ,
  3. `id_cliente`  int(11) NOT NULL ,
  4. `p_meses`  varchar(8000) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  5. `p_ano`  varchar(6) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  6. `p_observaciones`  varchar(300) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
  7. PRIMARY KEY (`id_pago`)
  8. )
  9. DEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ci
  10. ROW_FORMAT=COMPACT
  11. ;

y el campo p_ano muestra los años pagados ejemplo lo que se refleja alla arriba 2012,2010,2009,2008 lo que quiere es que haciendo una consulta a la tabla clientes por sector me refleje todos los clientes de ese sector y los ultimos 3 años que ha pagado mostrando el listado completo de los clientes no se si se me entiende

Última edición por thehack; 27/05/2012 a las 11:19 Razón: mal escrito
  #4 (permalink)  
Antiguo 27/05/2012, 20:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: consulta a mi base de datos mostrando los 3 ultimos años

La verdad, no estoy seguro de por donde empezar, porque tu problema es algo más complicado de lo esperado, especialmente si la base de datos ya está cargada con muchos registros en las tablas...

Mira, a primera vista, pensé que el único problema es que había una errónea selección de tipos de dato en tus columnas, e incluso que necesitaríamos usar alguna que otra función para manejar la cosa.
Pero cuando vi que mencionabas que en el mismo campo "p_ano", contiene datos como "2012,2010,2009,2008", la cosa se puso espesa, y más aún al percatarme de que "p_meses" tiene un ancho de 8000 caracteres, caí en cuenta que está base de datos es simple... como decirlo... Trash data.
Empecemos por el principio: Si no puedes modificar la estructura de las tablas para corregir los desmanes que tiene la base, simplemente ignora todo el resto del post, y busca alguna solución por el lado de la programación. El SQL no te va a ayudar, al menos no de una forma sencilla.

Explico esto: Has creado para esos dos datos, campos multivaluados, que no solamente están prohibidos en el modelo de Entidad-Relación (y por extensión en las bases de datos relacionales), sino que generan enormes problemas para las consultas, precisamente como el que te enfrentas.
El concepto de mes pagado (o cuota pagada), es siempre, en los diseños de base de datos, una tabla independiente en la cual cada registro representa el pago de una única cuota. Nunca de varias, y menos aún de un año entero. Y si un mismo pago corresponde a una serie de conceptos de deuda cancelada, entonces la tabla pagos tiene otra tabla dependiente donde se detalla (registro a registro) cada uno de los conceptos contenidos en ese único pago.
A todos los efectos, esta tabla, tal como la tienes, no sirve ni te servirá para realizar ni este reporte ni ningún otro, sin tener que hacer enormes malabarismos con diferentes funciones de MySQL para intentar obtener la información que requieres.

A mi entender, la única solución que tienes es depurar ese modelo, y crear las tablas correctamente, y recién allí tendrás alguna oportunidad de hacer ese reporte.

Si no quieres o no puedes hacer cambios, y quieres usar las tablas tal y como las tienes, desde ya te advierto que las consultas serán muy complejas, y probablemente debas resolverlo parcialmente en programación de la aplicación.
Yo, personalmente, ni me molestaría en intentarlas. Es perder demasiado tiempo en algo que se puede hacer más fácil y optimizado de otro modo.

Queda a tu decisión.

Tips adicionales:
1) Los nombres y los apellidos van siempre en campos separados. Ponerlos juntos genera complicaciones en las búsqueda, y además no facilita los ordenamientos de listados.
2) Toda entidad que pueda aparecer relacionada a diferentes personas, como es el caso de una parroquia (más de un cliente puede pertenecer a la misma), no se pone como un campo de texto, sino como FK de una tabla fija donde se guarden los datos de esa entidad. Evita que el usuario escriba de dos formas diferentes el mismo dato, y reduce el espacio de disco usado en la tabla.
3) Un cliente que puede identificarse de una forma segura con su documento, no requiere de un ID numerico. Si el documento es un dato obligatorio, es preferible que sea también su PK.
4) Las serializaciones de datos en la aplicación no son necesariamente una buena idea para datos de una tabla. Como no representan datos para el SQL, pueden complicar las consultas más que beneficiarlas. Ten en cuenta que el SQL no interpretará los datos contenidos, sino que los tomará como simples cadenas de texto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: años3actuales, consulta+sql, dbmysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:11.