none
Como hacer que en una consulta WHERE algunos datos se deban cumplir y otros no? RRS feed

  • Pregunta

  • Hola amigos, primero me disculpo por el título pero no sabía realmente como llamar a esta duda que tengo, ojala me puedan ayudar.

    La cuestión está así:

    Tengo un SP que realiza una consulta a varias tablas de la BD a la que estoy accediendo unidas, valga la redundancia, por Inner Join. Para seleccionar dichos registros ocupo varias condiciones en la clausula WHERE. De aqui el problema siguiente. Ocupo que el SP me retorne todos los registros de acuerdo a un usuario en especifico o a un departamento en especifico(donde en el departamento tenemos varios usuarios), ademas que me retorne los registros segun una variable que se llama IDTipoSolicitud (que esta puede ser 1 o 2) donde estos 2 valores vienen desde el sistema.

    Hasta aqui no es complicado ya que tengo:

    WHERE USUARIO.NOMBREUSUARIO = @NombreUsuario and SOLICITUDCOMPRA.IDTIPOSOLICITUD = @TipoSolicitud 

    El asunto es este. ademas de que lo que retorna el sp pertenezca a ese usuario o Dpto y a un TipoSolicitud como tal, existe una variable que se llama EstadoSolicitud (que puede tener 7 diferentes estados enumerados del 1 al 7), donde el SP debe retornar, aparte de las solicitudes filtradas por Usuario y TipoSolicitud, todas las solicitudes que tengan un EstadoSolicitud distinto de 4 y 7, y que retorne las solicitudes que tienen un estado 4 o 7 pero filtrandolos de los ultimos 15 dias a la fecha (en otras palabras debe retornar todas las solicitudes de ese Usuario con el TipoSolicitud y con todos los EstadoSolicitud y las que tienen estado 4 o 7 solamente la de los ultimos 15 dias en ese estado).

    Ojala me haya dado a entender.

    No logro realmente como darle a esa clausula Where, que me permita hacer todos esos filtros en la misma sentencia y que me retorne al final todos los registros con toda la información en una sola consulta.

    Se que podria hacer las consultas por separado, primero haciendo que extraiga todas las solicitudes de ese usuario con ese tipoSolicitud y todas las que sean distintas de 4 y 7, luego haciendo otra consulta que solo me traiga las de 4 y 7 filtrado de los ultimos 15 dias. pero ya con eso tengo 2 consultas separadas y como es para meter esa informacion en un Gridview y que ademas tiene que ir ordenado por otros parametros se complica un poco mas.

    Ojala alguno me pueda ayudar a solucionar este dilema. y si es posible con el ejemplo aun mejor.

    Desde ya muchas gracias por las respuestas.

    Saludos.

     

    lunes, 22 de agosto de 2011 21:39

Respuestas

  • La lógica es , además del filtro que pones, solamente si el estado es 4 o 7 hay que aplicar un filtro mas, que sea solamente de los ultimos 15 dias

     

    WHERE ( USUARIO.NOMBREUSUARIO = @NombreUsuario and SOLICITUDCOMPRA.IDTIPOSOLICITUD = @TipoSolicitud )
    
    and fechaSolicitud>= case when estadosolicitud in (4,7) then getdate()-15 else cast('19000101' as datetime) end 
    
    

    El segundo filtro usará hoy-15 solo para aquellas cuyo estadosolicitud sea 4 o 7 y para todas las demás... será el inicio de los tiempos, o lo que es lo mismo.. ningun filtro..

    Creo que con union no podrias porque aquellas de estado solicitud 4,7 aparecian todas independientemente de su fecha.. y si te entendí bien ese no es tu requisito.

     


    Comparte lo que sepas, aprende lo que no sepas (FGG) http://www.portalsql.com
    lunes, 22 de agosto de 2011 22:24
    Moderador

Todas las respuestas

  • Si ya tienes construidas las consultas por separado puedes perfectamente unificarlas por medio de la instrucción UNION, puesto que según veo lo que las diferencia no son las columnas, sino las condiciones que estableces, las otra opcion que me viene a la mente (SQL Dinamico) solo le agregarian complejidad en un escenario que posiblemente no lo amerite, como ejemplo del uso de UNION:

    SELECT Columna1 As Encabezado1,Columna2 As Encabezado ...
    FROM TABLA_CONSULTA
    WHERE ...... (LISTA DE FILTROS REQUERIDOS)
    UNION
    SELECT Columna1,Columna2 ...
    FROM TABLA_CONSULTA
    WHERE ...... (LISTA DE FILTROS REQUERIDOS)
    


    Como puntos a tomar en cuenta te menciono que las columnas deben coincidir (tanto en tipo como en cantidad), los encabezados que se toman para el conjunto de los resultados es el establecido en la primera columna.  Encontraras mas detalles sobre este OPERADOR en los BOL.  Cualquier duda con gusto te podemos apoyar.

    "El talento es una disciplina tenaz y una larga paciencia"  Gustave Flaubert

     Email: info@geohernandez.com Blog: geeks.ms/blogs/ghernandez

     

    lunes, 22 de agosto de 2011 22:13
  • La lógica es , además del filtro que pones, solamente si el estado es 4 o 7 hay que aplicar un filtro mas, que sea solamente de los ultimos 15 dias

     

    WHERE ( USUARIO.NOMBREUSUARIO = @NombreUsuario and SOLICITUDCOMPRA.IDTIPOSOLICITUD = @TipoSolicitud )
    
    and fechaSolicitud>= case when estadosolicitud in (4,7) then getdate()-15 else cast('19000101' as datetime) end 
    
    

    El segundo filtro usará hoy-15 solo para aquellas cuyo estadosolicitud sea 4 o 7 y para todas las demás... será el inicio de los tiempos, o lo que es lo mismo.. ningun filtro..

    Creo que con union no podrias porque aquellas de estado solicitud 4,7 aparecian todas independientemente de su fecha.. y si te entendí bien ese no es tu requisito.

     


    Comparte lo que sepas, aprende lo que no sepas (FGG) http://www.portalsql.com
    lunes, 22 de agosto de 2011 22:24
    Moderador
  • Hola Geovanny, hola Miguel,

     

    Muchas gracias a ambos por la respuesta, efectivamente la que me ayudó a solventar el problema fue la segunda respuesta.

    Ya pude obtener los datos que necesitaba de la manera que les expuse.

     

    Realmente muchas gracias por sus tiempos y saludos.

     

    lunes, 22 de agosto de 2011 22:54