Ir al contenido



Foto

Dado el siguiente QUERY defina la salida y lógica del mismo


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

#1 elporfirio

elporfirio

    Advanced Member

  • Miembros
  • PipPipPip
  • 182 mensajes
  • LocationMy House @ México

Escrito 15 enero 2015 - 06:30

Este fue un query que tome de un sistema productivo, por supuesto muuuy mal diseñado en cuanto a la BD.

Solo los SQL con más expertise podrán superar este challenge.

Dado el siguiente Query, defina la Salida y Lógica del mismo.

versión BONITA: https://gist.github....54e93e07b503164


SELECT
vw.categoria_id tipoBoleto_id,
MAX(vw.total) total
FROM
(SELECT
piv.corrida_id,
piv.feccorrida,
piv.numsecorigen,
piv.numsecdestino,
daf.categoria_id,
COUNT(daf.disponibilidad_id) total
FROM
(SELECT
tc.numsecorigen,
tc.numsecdestino,
tc.corrida_id,
tc.feccorrida
FROM
CORRIDA_TRAMO tc
WHERE tc.activo = 1
) piv,
(SELECT
da.disponibilidad_id,
da.secorigen,
da.secdestino,
da.categoria_id,
da.corrida_id,
da.feccorrida
FROM
(SELECT
vct.corrida_id,
vct.feccorrida,
vct.secorigen,
vct.secdestino,
vct.numasiento,
vct.categoria_id,
vct.statusasiento,
vct.disponibilidad_id
FROM
(SELECT
da.corrida_id,
da.feccorrida,
da.secorigen,
da.secdestino,
da.numasiento,
da.categoria_id,
da.statusasiento,
da.disponibilidad_id
FROM
DISPONIBILIDAD da
WHERE
da.numasiento IN (SELECT
dda.asiento
FROM
DET_DIAGRAMA_AUTOBUS dda
WHERE dda.diagramaautobus_id =  :DiagramaAutobusId
AND dda.activo = 1)
AND
da.activo = 1) vct,
(SELECT
da2.corrida_id,
da2.feccorrida,
da2.secorigen,
da2.secdestino,
da2.numasiento,
da2.categoria_id,
da2.statusasiento,
da2.disponibilidad_id
FROM
DISPONIBILIDAD da1,
DISPONIBILIDAD da2
WHERE
da2.corrida_id = da1.corrida_id
AND da2.feccorrida = da1.feccorrida
AND da2.numasiento = da1.numasiento
AND da2.secorigen > da1.secorigen
AND da2.secorigen > :SecOrigen
AND da2.secdestino <= :SecDestino
AND da1.categoria_id IS NOT NULL
AND da2.categoria_id IS NULL
AND da1.activo = 1
AND da2.activo = 1) clv
WHERE
vct.corrida_id=clv.corrida_id(+)
AND vct.feccorrida=clv.feccorrida(+)
AND vct.secorigen=clv.secorigen(+)
AND vct.secdestino=clv.secdestino(+)
AND vct.numasiento=clv.numasiento(+)
AND vct.categoria_id=clv.categoria_id(+)
AND vct.statusasiento=clv.statusasiento(+)
AND vct.disponibilidad_id=clv.disponibilidad_id(+)
AND clv.corrida_id IS NULL
) da
) daf
WHERE
piv.corrida_id = daf.corrida_id
AND
piv.feccorrida = daf.feccorrida
AND
((daf.categoria_id IS NULL AND daf.secorigen <> :SecOrigen) OR daf.categoria_id IS NOT NULL)
AND
((daf.secorigen <= piv.numsecorigen AND daf.secdestino > piv.numsecorigen) OR (daf.secorigen >= piv.numsecorigen AND daf.secorigen < piv.numsecdestino))
GROUP BY
piv.corrida_id,
piv.feccorrida,
piv.numsecorigen,
piv.numsecdestino,
daf.categoria_id
ORDER BY
daf.categoria_id
) vw
WHERE
vw.numsecorigen >= :SecOrigen
AND
vw.numsecdestino <= :SecDestino
AND
vw.corrida_id = :CorridaId
AND
vw.feccorrida = :fechaCorrida
AND
vw.categoria_id <> 1
GROUP BY
vw.categoria_id

  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 15 enero 2015 - 07:28

Así a groso modo, la salida como tal son solo dos columnas: tipoBoleto_id (que es alias de categoria_id) y total (alias de la expresión MAX(vw.total)); de un query que recibe 5 parámetros (:aSecOrigen, :aSecDestino, :aCorridaId, :fecCorrida y :aDiagramaAutobusId) y ataca las tablas CORRIDA_TRAMO, DISPONIBILIDAD Y DET_DIAGRAMA_AUTOBUS.

En cuanto a lógica, no tiene nada del otro mundo, solo que se requiere de algo de tiempo ( que es escaso por estas épocas) para analizar la forma en qué se obtienen las dos columnas de salida.

Lo que se puede intuir es que dados un lugar de origen , un lugar de destino, una fecha, un identificador de un viaje (quizá) y un diagrama de las sillas de un autobus, la consulta devuelve las cantidades de boletos agrupados por el tipo de estos.


Un cordial saludo.
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 16 enero 2015 - 08:14

uffffff ese query me recuerda a mis inicios...  *-) *-)  *-)  :D  :D.

Por cierto, ahora en la mayoría de mis sistemas uso procedimientos almacenados con lo que he mejorado el rendimiento de mis aplicaciones.
  • 0

#4 elporfirio

elporfirio

    Advanced Member

  • Miembros
  • PipPipPip
  • 182 mensajes
  • LocationMy House @ México

Escrito 16 enero 2015 - 10:01

Ah pues la situación es que tuve que hacer la lógica de los querys actuales para un PLSQL, y así generar puros SP por que el performance anda bajo.

Sin embargo no me dejaron hacer un refactor a la aplicación, que se debe leer con una cruz y agua bendita en mano.

En lo personal también me iría a SP, igual con tablas temporales.
  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 16 enero 2015 - 10:32

En lo personal también me iría a SP, igual con tablas temporales.


Coincido plenamente. En consultas de ese tipo es lo mejor.
  • 0

#6 deCTod

deCTod

    Member

  • Miembros
  • PipPip
  • 24 mensajes
  • LocationPerú

Escrito 21 enero 2015 - 03:31

Hola,

Personalmente iría también con un Procedimiento pero en lugar de utilizar tablas temporales utilizaría un cursor.

Saludos
  • 0