Ir al contenido


Foto

Cross table con rango de datos no funciona en Firebird


Mejor respuesta egostar , 15 noviembre 2016 - 12:54

Hola

 

Opcion 1: Utiliza INNER JOIN en lugar de LEFT JOIN y elimina los IS NOT NULL.

 

Opcion 2: Los filtros de IS NOT NULL colocalos en su JOIN correspondiente.

 

Avisanos como funciona :)

 

Saludos

Ir al mensaje completo


  • Por favor identifícate para responder
5 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 noviembre 2016 - 06:08

Amigos, tengo esta consulta cross table, por lo que veo el rango entre dos datos (Tipo numérico) no lo toma en cuenta:


sql
  1. WITH CONTEO AS (
  2. SELECT
  3. V.VEH_YEAR_ADQ,
  4. COUNT(*) AS TOTAL
  5. FROM
  6. VEHICULOS V
  7. WHERE V.VEH_PERTENECE = :pert AND V.VEH_STATUS IN (1,4)
  8. GROUP BY 1
  9. )
  10.  
  11. SELECT v1.veh_year_adq, (s1.TOTAL) AS Compra, (s2.TOTAL) AS donacion,(S3.TOTAL) AS Prestado, s4.TOTAL AS transferencia, s4.TOTAL AS alquilado FROM vehiculos v1
  12. LEFT JOIN conteo s1 ON v1.veh_tipo_origen = 0
  13. LEFT JOIN conteo s2 ON v1.veh_tipo_origen = 1
  14. LEFT JOIN conteo s3 ON v1.veh_tipo_origen = 2
  15. LEFT JOIN conteo s4 ON v1.veh_tipo_origen = 3
  16. LEFT JOIN conteo s5 ON v1.veh_tipo_origen = 4
  17. WHERE
  18. s1.total IS NOT NULL OR
  19. s2.total IS NOT NULL OR
  20. s3.total IS NOT NULL OR
  21. s4.total IS NOT NULL OR
  22. s5.total IS NOT NULL OR
  23. v1.veh_year_adq IS NOT NULL AND
  24. v1.veh_year_adq >= :desde AND v1.veh_year_adq <= :hasta
  25. GROUP BY v1.veh_year_adq,compra,donacion,prestado,transferencia,alquilado

Por un lado tarda mucho y me muestra todos los datos

 

Archivo adjunto  rango_cross.png   4,64KB   1 descargas

 


  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 15 noviembre 2016 - 02:18

Hola, no acabo de entender el resultado que estás buscando. ¿ Puedes mostrar que es lo que querrías que salga para esos datos ?.


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2016 - 04:51

Hola Marc, el problema está en que si coloco un rango por ejemplo entre 2012 y 2016 aún me trae todos los datos, y no sólo ese rango.
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2016 - 12:37

Retomando este problema reformulé la consulta y ya me funciona el rango de valores dados, la misma queda de esta manera:


sql
  1. WITH adquiridos AS (
  2. SELECT veh_year_adq, veh_tipo_origen, COALESCE(COUNT(*),0) AS total FROM vehiculos
  3. GROUP BY 1,2
  4. )
  5. SELECT v.veh_year_adq, a1.total AS compra,a2.total AS donacion, a3.total AS prestado, a4.total AS transferencia, a5.total AS alquilado FROM vehiculos v
  6. LEFT JOIN adquiridos a1 ON v.veh_year_adq = a1.veh_year_adq AND a1.veh_tipo_origen = 0
  7. LEFT JOIN adquiridos a2 ON v.veh_year_adq = a2.veh_year_adq AND a2.veh_tipo_origen = 1
  8. LEFT JOIN adquiridos a3 ON v.veh_year_adq = a3.veh_year_adq AND a3.veh_tipo_origen = 2
  9. LEFT JOIN adquiridos a4 ON v.veh_year_adq = a4.veh_year_adq AND a4.veh_tipo_origen = 3
  10. LEFT JOIN adquiridos a5 ON v.veh_year_adq = a5.veh_year_adq AND a5.veh_tipo_origen = 4
  11. WHERE v.veh_year_adq BETWEEN :desde AND :hasta
  12. ORDER BY v.veh_year_adq ASC

Ahora bien, obtengo los resultados al instante, pero..., me muestra datos nulos que no debe de aparecer, entonces agrego en el where lo siguiente:


sql
  1. WHERE v.veh_year_adq BETWEEN :desde AND :hasta AND
  2. a1.total IS NOT NULL OR
  3. a2.total IS NOT NULL OR
  4. a3.total IS NOT NULL OR
  5. a4.total IS NOT NULL OR
  6. a5.total IS NOT NULL

Ahora me devuelve los datos sin valores nulos, pero..., TARDA 20 SEGUNDOS!!, en una tabla con menos de 2,000 registros, a ver quién me puede ayudar a reducir esa tardanza?.

 

Saludos.


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 15 noviembre 2016 - 12:54   Mejor respuesta

Hola

 

Opcion 1: Utiliza INNER JOIN en lugar de LEFT JOIN y elimina los IS NOT NULL.

 

Opcion 2: Los filtros de IS NOT NULL colocalos en su JOIN correspondiente.

 

Avisanos como funciona :)

 

Saludos


  • 1

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2016 - 01:07

Opción 1: No devuelve ningún dato.

Opción 2: mismo resultado del original, aunque devuelve al instante.

 

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.