El día 15 de abril de 2010 19:26, Sergio Daniel Gomez
<[email protected]> escribió:
> Sergio Daniel Gomez escribió:
>>
>> Sergio Valdes Hurtado escribió:
>>>
>>> Estimados,
>>> Tengo una tabla con la siguiente estructura:
>>>
>>> RBD                    int             -- Es un identificador de
>>> establecimientos educacionales
>>> ano_pago             int             -- Año de pago
>>> mes_pago            int             -- Mes de pago
>>> monto                  int             -- Monto pagado
>>> tip_proc                vachar(1)   -- Identificador de Tipo de
>>> Proceso y puede tener el valor "N" o "S"
>>>
>>> En el caso de que el Tipo de Proceso sea "S",  sólo los meses de Marzo
>>> a Diciembre tienen este tipo de pago, es decir no hay pagos "S" en los
>>> meses de Enero y Febrero.
>>>
>>> Pues bien, me piden un informe que sume los pagos por año por tipo de
>>> Proceso ("N" o "S") y para ello hice la siguiente consulta:
>>>
>>> SELECT rbd, sum(monto)  FROM dbo.orden_pago
>>> where ano_pago =2009
>>> and tip_proc = "S"
>>> group by rbd
>>>
>>> El problema es que ahora me dicen que para este total debo incluir los
>>> meses de Enero y Febrero que tienen tipo de Pago "N" y sumarlo con lo
>>> que se obtiene en la consulta anterior.
>>>
>>> Mi pregunta es si se podrá hacer en una sola consulta?, ya que este es
>>> una base de datos heredada y sólo tenemos accesos de lectura y no
>>> podemos hacer funciones ni tablas temporales
>>>
>>> Saludos cordiales a todos
>>> --
>>> TIP 2: puedes desuscribirte de todas las listas simultáneamente
>>>    (envía "unregister TuDirecciónDeCorreo" a [email protected])
>>>
>> Podría ser ?
>>
>> SELECT rbd, sum(monto)  FROM dbo.orden_pago
>>    where ano_pago =2009
>>    and (tip_proc = "S"
>>       or (tip_proc = "N"
>>           and (mes_pago = "Enero"
>>               or mes_pago = "Febrero")
>>          )
>>    group by rbd
>>
>> --
>> TIP 8: explain analyze es tu amigo
>>
>
> Ups! mes_pago es int, entonces
> SELECT rbd, sum(monto)  FROM dbo.orden_pago
>     where ano_pago =2009
>     and (tip_proc = "S"
>        or (tip_proc = "N"
>            and (mes_pago between 1 and 2)
>           )
>     group by rbd;
>
> suponiendo que enero = 1, febrero = 2, etc.
>
>
Estimados,

tome la idea de Sergio Gómez y al final lo dejé de esta forma

SELECT rbd, sum(monto)  FROM dbo.orden_pago
    where ano_pago =2009
    and (tip_proc = "S"
       or (tip_proc = "N"
           and mes_pago < 3))
    group by rbd;

Fue una gran sorpresa para mi el manejo de los AND y OR anidados

Gracias a todos por sus aportes
--
TIP 7: no olvides aumentar la configuración del "free space map"

Responder a