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

[SOLUCIONADO] Consulta que devuelva cantidad variable de registros

Estas en el tema de Consulta que devuelva cantidad variable de registros en el foro de Mysql en Foros del Web. Hola gente, el titulo del tema no es muy afortunado, pero nose bien como expresar lo que quiero hacer. Tengo estas 5 tablas: ** Polizas ...
  #1 (permalink)  
Antiguo 06/02/2014, 11:04
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Consulta que devuelva cantidad variable de registros

Hola gente, el titulo del tema no es muy afortunado, pero nose bien como expresar lo que quiero hacer.

Tengo estas 5 tablas:

** Polizas **
-> Nic (PK)
-> Seccion (FK)
-> Vigente_Desde
-> Vigente_Hasta
-> [...]

** Secciones **
-> Id (PK)
-> Es_Auto (Integer boolean 1/0)
-> [...]

** Detalles **
-> Nic (FK)
-> Descripcion (Varchar)

** Autos **
-> Id_Auto (PK)
-> Nic (FK)
-> Matricula
-> Marca
-> Modelo
-> [...]

** Detalle_Auto **
-> Id_Auto (FK)
-> Tiene_Radio (Integer boolean 1/0)
-> [...]

La estructura de las tablas no puedo modificarlas, ya que son de un sistema que ya esta hecho (y no lo hice yo), así que tendría que resolver esto solo con un select.

Lo que quiero hacer es, para las pólizas que estén vigentes, (NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta) Ver si pertenecen a una seccion que sea de autos, si es asi, devolver la matricula, marca, modelo y si tiene radio, ademas de todos los detalles asociados a la poliza. Si no es auto, solo devolver los detalles asociados.


Para que se den una idea esto es para un sistema hibrido, esta consulta voy a tener que ejecutarla en mysql y en sql server 2000

Tiene que funcionar para todas las polizas en una sola vez.
Esta es la consulta tal como la tengo hasta ahora:

Código MySQL:
Ver original
  1. (SELECT Polizas.Nic AS Codigo_Poliza, 'Detalle:' AS Nombre, Detalles.Descripcion AS Descripcion
  2. FROM Polizas
  3. INNER JOIN Detalles ON Polizas.Nic = Detalles.Nic
  4. WHERE NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta)
  5.  
  6.  
  7. (SELECT Polizas.Nic AS Codigo_Poliza, 'Matricula:' AS Nombre, Autos.Matricula AS Descripcion
  8. FROM Polizas
  9. INNER JOIN Secciones ON Polizas.Seccion = Secciones.Id
  10. INENR JOIN Autos ON Polizas.Nic = Autos.Nic
  11. WHERE NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta AND Secciones.Es_Auto = 1)

Preguntas:
1-> La unica forma de hacerlo es agregando mas union y mas consultas por cada campo?
2-> Como podria ordenar el resultado de todas las union por Nic?
3-> Que es lo que tendria que cambiarle para que funcione en sql server 2000 ademas de en mysql?

Muchas gracias
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 07/02/2014, 04:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta que devuelva cantidad variable de registros

Código MySQL:
Ver original
  1. SELECT Sbc.Codigo_Poliza, Sbc.Nombre, Sbc.Descripcion
  2. ((SELECT Polizas.Nic AS Codigo_Poliza, 'Detalle:' AS Nombre, Detalles.Descripcion AS Descripcion
  3. FROM Polizas
  4. INNER JOIN Detalles ON Polizas.Nic = Detalles.Nic
  5. WHERE NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta)
  6.  
  7.  
  8. (SELECT Polizas.Nic AS Codigo_Poliza, 'Matricula:' AS Nombre, Autos.Matricula AS Descripcion
  9. FROM Polizas
  10. INNER JOIN Secciones ON Polizas.Seccion = Secciones.Id
  11. INENR JOIN Autos ON Polizas.Nic = Autos.Nic
  12. WHERE NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta AND Secciones.Es_Auto = 1)) Sbc
  13. ORDER BY Sbc.Codigo_Poliza;

Así se ordenara el union ... por lo demas no acabo de entender lo que quieres....

Si ste trata de listar polizas con sus autos si tenen. un LEFT JOIN entre polizas y autos te asegura de listar TODAS las polizas tengan o no autos y todos los autos....

Para que se entienda deberías poner unos ejemplos de datos de las tablas y del resultado esperado sobre esos datos.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 07/02/2014, 15:51
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consulta que devuelva cantidad variable de registros

Hola, gracias por lo del union, me funciono a la perfeccion.

Lo siento, creo que cuando uno ve los datos le parece tan obvio que cree que es igual para todo el mundo y evintemente no lo es, mil disculpas intentare explicarme mejor.

El left join no me sirve, ya que nesesito que se listen los autos de las polizas que pertenezcan a una seccion de automotores. Algunos datos de ejemplo rapidos:

** Polizas **
Nic | Seccion | Vigente_Desde | Vigente_Hasta
1 | 1 | 2014-01-01 | 2014-02-01
2 | 2 | 2014-01-01 | 2014-02-01

** Secciones **
Id | Es_Auto
1 | 1
2 | 0

** Detalles **
Nic | Descripcion
1 | Alta inmediata
1 | Abona 8 cuotas
1 | 3 Cuotas pagas al inicio
2 | Domicilio: Calle 123
2 | Segundo piso, el portero esta mal tocar 3º A
2 | Asegura hasta el monto $xxx
2 | Paredes de machimbre


** Autos **
Id_Auto | Nic | Matricula | Marca | Modelo
1 | 1 | XXX-123 | Peugeot | 2009
2 | 1 | FFF-123 | Fiat | 2009
3 | 1 | ZZZ-123 | Bmw | 2009
900 | 2 | YYY-123 | Peugeot | 2009

** Detalle_Auto **
Id_Auto | Tiene_Radio | [..Mas caracteristicas..]
1 | 0 | [...]
3 | 1 | [...]
900 | 1 | [...]


La relacion entre autos y detalle_auto es de 1 a 1 pudiendo no existir detalle para ese auto.
La relacion entre autos y polizas es el nic, pudiendo un auto apuntar a una poliza que no sea de automotores.

Lo que quiero, supongamos los datos anteriores es esto:
Poliza | auto | nombre | detalle
1 | 0 | 'General' | Alta inmediata
1 | 0 | 'General' | Abona 8 cuotas
1 | 0 | 'General' | 3 Cuotas pagas al inicio
1 | 1 | 'Matricula'| XXX-123
1 | 1 | 'Marca' | Peugeot
1 | 1 | 'Modelo' | 2009
1 | 1 | 'Radio' | No tiene
1 | 2 | 'Matricula'| FFF-123
1 | 2 | 'Marca' | Fiat
1 | 2 | 'Modelo' | 2009
1 | 2 | 'Radio' | No Tiene
1 | 3 | 'Matricula'| ZZZ-123
1 | 3 | 'Marca' | Bmw
1 | 3 | 'Modelo' | 2009
1 | 3 | 'Radio' | Tiene
2 | 0 | 'General' | Domicilio: Calle 123
2 | 0 | 'General' | Segundo piso, el portero esta mal tocar 3º A
2 | 0 | 'General' | Asegura hasta el monto $xxx
2 | 0 | 'General' | Paredes de machimbre


Notese que el auto 900 apunta a la poliza 2 pero como esta no es de automotores, no se muestran sus detalles.
Puse marca, matricula y modelo, pero son mas propiedades que hay que mostrar como esas

Espero haberme explicado un poco mejor ahora
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 10/02/2014, 02:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta que devuelva cantidad variable de registros

Casi pero aún faltan cosas....

Antes que nada las distintas querys que formen parte de una query union deben tener los mismos campos..... Si la lista de campos de la salida es

Poliza | auto | nombre | detalle

deberiamos tener claro a que campos corresponden de las tablas....

Poliza corresponde a Nic (que esta en todas las tablas importantes)

Auto no se a que campo corresponde (en el ejemplo es 0,1,2 o 3)
Podria ser el Id_Auto, y 0 constante para lo que no son autos?

Nombre no se a que campo corresponde (General,Matricula,Marca,Modelo,Radio)
Parece ser "General" constante para lo que no son autos
Para los autos parece ser el nombre de la característica que viene a continuación, aqui tenemos un problema, lo mas parecido serian los nombres de los campos de la tabla Auto y los de Detalle_auto (estos ultimos transformados de "Tiene_Radio" a "Radio").


detalle Seria descripción de la tabla detalles, para lo que no son autos y una diversidad de campos para los autos.... (Tambien trans formados de "Tiene_Radio" 1 o 0 a "Tiene" o "No Tiene").

Si lo consegues sera una query muy MUY ineficiente, seria mejor listar una cosa por un lado y la otra por otro....

Primera parte, lo que no son autos

Código MySQL:
Ver original
  1. SELECT Polizas.Nic AS Poliza,
  2.              0 AS Auto,
  3.              'General' AS Nombre,
  4.              Detalles.Descripcion AS Detalle
  5. FROM Polizas INNER JOIN Detalles
  6.           ON Polizas.Nic = Detalles.Nic
  7. WHERE NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta
  8.    AND Polizas.Seccion = 2

El problema de los autos es que pretendes convertir lo que son campos (columnas) en registros (filas).

Código MySQL:
Ver original
  1. FROM Polizas INNER JOIN
  2.              (Autos LEFT JOIN Detalle_Auto
  3.                       ON Autos.id_Auto=Detalle_Autos.id_Auto)
  4.              ON Polizas.Nic = Autos.Nic
  5. WHERE NOW() BETWEEN Polizas.Fecha_desde AND Polizas.Fecha_Hasta
  6.    AND Polizas.Seccion = 1

Esto te da los datos de los autos pero en en un registro por auto....

A partir de estos dos resultados y con programación externa buscaria el resultado que pides...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 11/02/2014, 10:47
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consulta que devuelva cantidad variable de registros

Hola quimfv, todas tus suposiciones son correctas , he logrado armar una query que me arroja los resultados aunque lamentablemente recurri el metodo ineficiente que mencionas. Hice un select de todos los detalles de las polizas vigentes con un 0 y 'general' constantes.
La uni con un select que trae la marca con el id del auto y 'Marca' constante para las polizas vigentes, y de esta misma forma, uni 23 select mas, que traen detalles de los autos, en total son 25 select unidos, luego los ordene como me explicaste en el primer mensaje por nic de poliza y por codigo de auto, y por orden alfabetico de nombre.

Se demora unos 15 segundos en ejecutarse ya que las tablas rozan los 500.000 registros O.O como es algo que se ejecutara solo una vez al dia y nada mas lo dejare asi gracias por la ayuda
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: campo, cantidad, join, registros, select, sql, tabla, variable
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 09:49.