0

tengo una duda con una consulta de SQL server. Explico:

Lo que quisiera saber es si existe la posibilidad de condicionar una busqueda segun un campo.

Quisiera algo asi:

SELECT * FROM prestamos pre
INNER JOIN polizas pol ON pre.id_poliza = pol.id_poliza and 
if (pre.id_status == 11) 
     //Aqui buscar en tabla endosos los que cumplan condicion
     //Algo asi como: 
     INNER JOIN endosos eds ON pol.id_poliza = eds.id_poliza and eds.tipo_endoso = 9
else if(pre.id_status in (5,7,14))
     // No hacer nada.

Algo asi, se que esta mal lo que escribi, espero se entienda la idea de lo que quiero, solo cuando id_status es igual a 11 realizar la otra busqueda. El resultado esperado serian todos los prestamos con id_stattus 5,7,14 y 11 pero los estatus 11 deben cumplir con tipo_endoso = 9

Me podrian indicar como resolverlo.

Saludos.

/// ACTUALIZACION.

Declare @fechaIn as datetime
set @fechaIn = '2017/03/09'
set @fechaIn = replace(convert(NVARCHAR, @fechaIn, 111), '/', '-')
SELECT 
pre.ID_FolPrestamo
, pre.ID_Poliza
, pre.Fecha_StaPtoPB
, pre.ID_StaPtoPB
, eds.ID_Endoso
FROM Prestamos_PB pre
INNER JOIN Polizas pol 
    ON pre.ID_Poliza = pol.ID_Poliza
LEFT JOIN Endosos eds 
    ON pol.ID_Poliza = eds.ID_Poliza
WHERE   (pre.ID_StaPtoPB in (5,7,14) 
        OR ( pre.ID_StaPtoPB = 11 AND eds.ID_Endoso = 9))
        AND Year(pre.Fecha_StaPtoPB) = Year(@fechaIn)
        AND Month(pre.Fecha_StaPtoPB) = Month(@fechaIn)
        AND day(pre.Fecha_StaPtoPB) = Day(@fechaIn)
order by pre.ID_FolPrestamo asc

El resultado es este:

173153  90913   2017-03-09 13:21:11.787 11  9
206820  85985   2017-03-09 13:09:06.243 11  9
216861  102548  2017-03-09 13:03:17.487 14  NULL
216922  5445    2017-03-09 13:03:14.720 14  8
216922  5445    2017-03-09 13:03:14.720 14  7
216922  5445    2017-03-09 13:03:14.720 14  10
216922  5445    2017-03-09 13:03:14.720 14  25
216922  5445    2017-03-09 13:03:14.720 14  25
216938  64048   2017-03-09 13:03:08.590 7   NULL
216976  106401  2017-03-09 13:03:05.210 14  NULL
217013  21256   2017-03-09 13:03:02.480 5   25
217013  21256   2017-03-09 13:03:02.480 5   25

Como ven no quiero que se repitan los registros por ejemplo '216922 5445' tiene varias lineas ya que tiene varios endosos. Lo que no quiero es que haga el JOIN cuando estatus = 5,7,14

2 Answers2

2

Vamos a lo esencial de tu pregunta:

El resultado esperado serian todos los prestamos con id_stattus 5,7,14 y 11 pero los estatus 11 deben cumplir con tipo_endoso = 9

Entiendo que lo puedes resolver así:

  SELECT * 
    FROM prestamos pre
    INNER JOIN polizas pol 
        ON pre.id_poliza = pol.id_poliza
    LEFT JOIN (SELECT   id_poliza, tipo_endoso
        FROM endosos eds 
        WHERE tipo_endoso = 9
        GROUP BY id_poliza, tipo_endoso
    ) eds
        ON pol.id_poliza = eds.id_poliza
    WHERE   pre.id_status in (5,7,14) 
            OR ( pre.id_status = 11 AND eds.tipo_endoso = 9)

Comentarios:

  • Con una subconsulta obtenemos las polizas que tienen un tipo_endoso = 9 que usaremos mediante un LEFT JOIN para tener la condición adicional para id_status = 11
  • Las condiciones se manejan directamente en el WHERE y creo que son sencillas de entender
Patricio Moracho
  • 54,367
  • 12
  • 35
  • 68
  • Si los estatus 5,7 y 14 si tiene registros en endosos, pero no me interesan ya que su tipo_endos no importa. No habria problema pero la cuestion es como si tienen, los registros regresados se duplican, por ejemplo un id_status = 5 tiene en Endosos 2 registros, uno con tipo_endoso = 25 y otro con tipo_endoso=8, por lo tanto me regresa esos dos registros y se ve duplicado por su id_poliza es igual. Lo ideal es que cuando id_estatus = 5,7,14 no hiciera un JOIN para no tener estos duplicados. – Osiel Candido Onofre Nov 09 '17 at 18:18
  • @OsielCandidoOnofre Te entiendo, revisa mi última edición, creo que se acerca más a lo que buscas. – Patricio Moracho Nov 09 '17 at 18:28
  • Wow exactamente eso @Patricio, muchas gracias, es lo que buscaba. Me podrias explicar la logica de ese Left join o donde se puede encontrar informacion mas exacta de ese tipo de consulta. Gracias una vez mas – Osiel Candido Onofre Nov 09 '17 at 18:32
  • @OsielCandidoOnofre Las combinaciones entre tablas se manejan por las sentencias `JOIN`, hay varios tipos, el `INNER` son todos los registros de una tabla que coincidan exactamente con la otra tabla, el `LEFT` son todos los de una tabla y solo aquellos que coincidan con la otra. Revisá esta pregunta, esta orientada a MySql pero es similar en Sql Server: https://es.stackoverflow.com/questions/36/cu%C3%A1l-es-la-diferencia-entre-un-inner-y-un-outer-join – Patricio Moracho Nov 09 '17 at 18:41
1

Te dejo otra opción que se basa en la respuesta de Patricio, pero que simplifica un poco el LEFT JOIN para no tener que hacer agrupaciones adicionales:

SELECT * 
FROM prestamos pre
INNER JOIN polizas pol
  ON pre.id_poliza = pol.id_poliza
LEFT JOIN endosos eds 
  ON pol.id_poliza = eds.id_poliza
  AND eds.tipo_endoso = 9
where pre.id_status in (5,7,14)
   or (pre.id_status = 11 AND eds.id_poliza is not null)
sstan
  • 16,591
  • 2
  • 21
  • 45