Jump to content


Photo

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


  • Please log in to reply
5 replies to this topic

#1 porfi.dev

porfi.dev

    Advanced Member

  • Miembros
  • PipPipPip
  • 183 posts
  • LocationMy House @ México

Posted 15 January 2015 - 06:30 PM

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
  • 2137 posts

Posted 15 January 2015 - 07:28 PM

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
  • 4945 posts
  • LocationMéxico

Posted 16 January 2015 - 08:14 AM

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 porfi.dev

porfi.dev

    Advanced Member

  • Miembros
  • PipPipPip
  • 183 posts
  • LocationMy House @ México

Posted 16 January 2015 - 10:01 AM

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
  • 4945 posts
  • LocationMéxico

Posted 16 January 2015 - 10:32 AM

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 William dFlota

William dFlota

    Member

  • Miembros
  • PipPip
  • 34 posts
  • LocationPerú

Posted 21 January 2015 - 03:31 PM

Hola,

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

Saludos
  • 0




IP.Board spam blocked by CleanTalk.