Select vs Cursor

21/12/2004 - 16:21 por Anonimo | Informe spam
Hola buenos Dias,


Ante todo quiero aclarar que para nada soy amigo de los cursores en SQL, sin
embargo esta vez creo que no me queda otra salida :(. A ver tengo dos tablas,
Nomina y Transaccion, las dos tienen datos parecidos, sin embargo no estan
relacionadas.

La consulta en Transaccion es:

SELECT t.TipoServicio,t.TipoPago, t.NumeroAfiliacion, t.Identificacion,
t.Periodo AS FechaMesada, t.TipoCuenta, t.NumeroCuenta, t.NumeroCheque,
(ISNULL(t.ValorEfectivo,0) + ISNULL(t.ValorCheque,0)) AS
ValorPago, t.TipoTransaccion, t.codigocaja
FROM Transaccion t where CONVERT(CHAR(8),FechaHoraTransaccion,112)
Between '20040802' AND '20040802',

para esta consulta (369) registros

Ahora, necesito ponerle nombre a la identificacion con lo cual le agrego a
toda la sentencia y queda asi:

inner join
(SELECT DISTINCT TOP 100 percent CONVERT(BIGINT,IDENTIFICACION)
IDENTIFICACION,
LEFT( Rtrim(Ltrim(Nombres)) + ' ' + Rtrim(LTRIM(PrimerApellido)) + ' ' +
Rtrim(Ltrim(SegundoApellido)) + REPLICATE(' ',50) ,50)CustName
FROM NOMINA ) N
ON N.IDENTIFICACION = t.IDENTIFICACION
WHERE CONVERT(CHAR(8),FechaHoraTransaccion,112) Between '20040802' AND
'20040802'

Al hacer esto, arroja un resultado de 371 registros, por que puede haber en
transaccion una identificacion con varios numeros de afiliacion. Se que no es
un diseño correcto de las tablas pero no se pueden cambiar.

Alguna sugerencia ??

Gracias a todos de antemano
@dece

Preguntas similare

Leer las respuestas

#6 Anonimo
21/12/2004 - 21:19 | Informe spam
Pues en caso que el cliente haya tenido 2 pagos el mismo dia, se deben tener
los dos valores pagados, realmente ese es el problema que estos valores
aparecen dos veces c/u.

"Maxi" wrote:

Hola, ahora que las duplica esta bien, como solucionas el tema? vos queres
que no las duplique? de ser asi, cual de los 2 valores tomas?


Salu2
Maxi


"@dece" escribió en el mensaje
news:
> El cuento es el siguiente:
> Tengo dos tablas:
> Nomina y Transaccion
>
> Nomina: Datos de los clientes a quienes se les debe pagar. Cada cliente
> puede tener
> varios Numeros de Afiliacion y esta en la misma tabla.
> Periodo
> ,NumeroAfiliacion,PrimerApellido,SegundoApellido,Nombres,TipoIdentificacion,Identificacion
> Por cada periodo de pago se crea un nuevo registro es decir que la tabla
> puede contener:
>
> Periodo NumeroAfiliacion SegundoApelido Nombres TipoIdentificacion
> Identificacion
> 20040501 020040912 Perez Pedro 3 74
> 20040401 020040913 Perez Pedro 3 74
> 20040501 020040913 Perez Pedro 3 74
> 20040301 020040912 Perez SPedro 3 74
> 20040701 020040912 Perez Pedro 3 74
> 20040601 020040912 Perez Pedro 3 74
>
> Ahora, la tabla transaccion tiene:
>
> TipoTransaccion,TipoServicio,NumeroAfiliacion,Identificacion,Periodo,CodigoCaja,ValorEfectivo,ValorCheque,FechaHoraTransaccion
> 1 1 20040912100 74 20031201 3 448180.0000 .0000 2004-01-08 15:54:46.000
> 1 1 20040912100 74 20030901 3 448180.0000 .0000 2003-10-10 09:03:58.000
> 1 1 20040912100 74 20031001 9 448180.0000 .0000 2003-11-21 09:46:35.000
> 1 1 20040912100 74 20031101 9 914840.0000 .0000 2003-12-04 16:40:06.000
> 1 1 20040912100 74 20040101 5 477266.0000 .0000 2004-02-09 16:16:29.000
> Entonces para extraer los pagos hechos al cliente:
>
> SELECT t.TipoServicio,t.TipoPago, t.NumeroAfiliacion, t.Identificacion,
> t.Periodo AS FechaMesada, t.TipoCuenta, t.NumeroCuenta, t.NumeroCheque,
> (ISNULL(t.ValorEfectivo,0) + ISNULL(t.ValorCheque,0)) AS
> ValorPago, t.TipoTransaccion, t.codigocaja
> FROM Transaccion t where CONVERT(CHAR(8),FechaHoraTransaccion,112)
> Between '20040802' AND '20040802'
> en este caso son 369 registros
> Luego para el nombre a la identificacion del cliente entonces:
>
> SELECT DISTINCT TOP 100 percent CONVERT(BIGINT,IDENTIFICACION)
> IDENTIFICACION,
> LEFT( Rtrim(Ltrim(Nombres)) + ' ' + Rtrim(LTRIM(PrimerApellido)) + ' ' +
> Rtrim(Ltrim(SegundoApellido)) + REPLICATE(' ',50) ,50)CustName
> FROM NOMINA
> (Todos las identificaciones del cliente con el nombre)
>
> si hago Inner Join entre esto obtengo 371 registros.
> por que en este caso existe un cliente con dos pagos en el mismo dia y el
> join las duplica.
>
> En cambio con el cursor lo que hago es que por cada Identificacion en
> primer
> resultado hago una consulta a Nomina para sacar
> los Nombres del Cliente.
>
> El diseño ? No ni hablar, no se puede cambiar desafortunadamente.
> Cualquier sugerencia sera bien recibida.
>
> De antemano Gracias
> @dece
>
>
>
>
> "Maxi" wrote:
>
>> Hola, pero porque no me explicas bien que necesitas hacer y vemos como
>> sacar
>> ese cursor ;)
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "@dece" escribió en el mensaje
>> news:
>> > Gracias Maestro Maxi
>> >
>> > Me toco hacer un cursor.
>> > Lo siento mucho por el server :(
>> >
>> > @dece
>> >
>> > "Maxi" wrote:
>> >
>> >> Hola, no te entendi que es lo que buscas resolver :(
>> >>
>> >>
>> >> Salu2
>> >> Maxi
>> >>
>> >>
>> >> "@dece" escribió en el mensaje
>> >> news:
>> >> > Hola buenos Dias,
>> >> >
>> >> >
>> >> > Ante todo quiero aclarar que para nada soy amigo de los cursores en
>> >> > SQL,
>> >> > sin
>> >> > embargo esta vez creo que no me queda otra salida :(. A ver tengo
>> >> > dos
>> >> > tablas,
>> >> > Nomina y Transaccion, las dos tienen datos parecidos, sin embargo
>> >> > no
>> >> > estan
>> >> > relacionadas.
>> >> >
>> >> > La consulta en Transaccion es:
>> >> >
>> >> > SELECT t.TipoServicio,t.TipoPago, t.NumeroAfiliacion,
>> >> > t.Identificacion,
>> >> > t.Periodo AS FechaMesada, t.TipoCuenta, t.NumeroCuenta,
>> >> > t.NumeroCheque,
>> >> > (ISNULL(t.ValorEfectivo,0) + ISNULL(t.ValorCheque,0)) AS
>> >> > ValorPago, t.TipoTransaccion, t.codigocaja
>> >> > FROM Transaccion t where
>> >> > CONVERT(CHAR(8),FechaHoraTransaccion,112)
>> >> > Between '20040802' AND '20040802',
>> >> >
>> >> > para esta consulta (369) registros
>> >> >
>> >> > Ahora, necesito ponerle nombre a la identificacion con lo cual le
>> >> > agrego
>> >> > a
>> >> > toda la sentencia y queda asi:
>> >> >
>> >> > inner join
>> >> > (SELECT DISTINCT TOP 100 percent CONVERT(BIGINT,IDENTIFICACION)
>> >> > IDENTIFICACION,
>> >> > LEFT( Rtrim(Ltrim(Nombres)) + ' ' + Rtrim(LTRIM(PrimerApellido)) +
>> >> > ' '
>> >> > +
>> >> > Rtrim(Ltrim(SegundoApellido)) + REPLICATE(' ',50) ,50)CustName
>> >> > FROM NOMINA ) N
>> >> > ON N.IDENTIFICACION = t.IDENTIFICACION
>> >> > WHERE CONVERT(CHAR(8),FechaHoraTransaccion,112) Between '20040802'
>> >> > AND
>> >> > '20040802'
>> >> >
>> >> > Al hacer esto, arroja un resultado de 371 registros, por que puede
>> >> > haber
>> >> > en
>> >> > transaccion una identificacion con varios numeros de afiliacion. Se
>> >> > que
>> >> > no
>> >> > es
>> >> > un diseño correcto de las tablas pero no se pueden cambiar.
>> >> >
>> >> > Alguna sugerencia ??
>> >> >
>> >> > Gracias a todos de antemano
>> >> > @dece
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#7 ulises
21/12/2004 - 23:11 | Informe spam
Si tu problema es juntar esos pagos en lugar de hacer el
join con la tabla original realizala contra una tabla
derivada que contenga el agrupamiento de esos pagos por fecha.

Saludos,
Ulises

Pues en caso que el cliente haya tenido 2 pagos el mismo


dia, se deben tener
los dos valores pagados, realmente ese es el problema que


estos valores
aparecen dos veces c/u.

"Maxi" wrote:

Hola, ahora que las duplica esta bien, como solucionas




el tema? vos queres
que no las duplique? de ser asi, cual de los 2 valores




tomas?


Salu2
Maxi


"@dece" escribió en el




mensaje
news:
> El cuento es el siguiente:
> Tengo dos tablas:
> Nomina y Transaccion
>
> Nomina: Datos de los clientes a quienes se les debe




pagar. Cada cliente
> puede tener
> varios Numeros de Afiliacion y esta en la misma tabla.
> Periodo
>




,NumeroAfiliacion,PrimerApellido,SegundoApellido,Nombres,TipoIdentificacion,Identificacion
> Por cada periodo de pago se crea un nuevo registro es




decir que la tabla
> puede contener:
>
> Periodo NumeroAfiliacion SegundoApelido Nombres




TipoIdentificacion
> Identificacion
> 20040501 020040912 Perez Pedro 3 74
> 20040401 020040913 Perez Pedro 3 74
> 20040501 020040913 Perez Pedro 3 74
> 20040301 020040912 Perez SPedro 3 74
> 20040701 020040912 Perez Pedro 3 74
> 20040601 020040912 Perez Pedro 3 74
>
> Ahora, la tabla transaccion tiene:
>
>




TipoTransaccion,TipoServicio,NumeroAfiliacion,Identificacion,Periodo,CodigoCaja,ValorEfectivo,ValorCheque,FechaHoraTransaccion
> 1 1 20040912100 74 20031201 3 448180.0000 .0000




2004-01-08 15:54:46.000
> 1 1 20040912100 74 20030901 3 448180.0000 .0000




2003-10-10 09:03:58.000
> 1 1 20040912100 74 20031001 9 448180.0000 .0000




2003-11-21 09:46:35.000
> 1 1 20040912100 74 20031101 9 914840.0000 .0000




2003-12-04 16:40:06.000
> 1 1 20040912100 74 20040101 5 477266.0000 .0000




2004-02-09 16:16:29.000
> Entonces para extraer los pagos hechos al cliente:
>
> SELECT t.TipoServicio,t.TipoPago,




t.NumeroAfiliacion, t.Identificacion,
> t.Periodo AS FechaMesada, t.TipoCuenta,




t.NumeroCuenta, t.NumeroCheque,
> (ISNULL(t.ValorEfectivo,0) +




ISNULL(t.ValorCheque,0)) AS
> ValorPago, t.TipoTransaccion, t.codigocaja
> FROM Transaccion t where




CONVERT(CHAR(8),FechaHoraTransaccion,112)
> Between '20040802' AND '20040802'
> en este caso son 369 registros
> Luego para el nombre a la identificacion del cliente




entonces:
>
> SELECT DISTINCT TOP 100 percent




CONVERT(BIGINT,IDENTIFICACION)
> IDENTIFICACION,
> LEFT( Rtrim(Ltrim(Nombres)) + ' ' +




Rtrim(LTRIM(PrimerApellido)) + ' ' +
> Rtrim(Ltrim(SegundoApellido)) + REPLICATE(' ',50)




,50)CustName
> FROM NOMINA
> (Todos las identificaciones del cliente con el nombre)
>
> si hago Inner Join entre esto obtengo 371 registros.
> por que en este caso existe un cliente con dos pagos




en el mismo dia y el
> join las duplica.
>
> En cambio con el cursor lo que hago es que por cada




Identificacion en
> primer
> resultado hago una consulta a Nomina para sacar
> los Nombres del Cliente.
>
> El diseà±o ? No ni hablar, no se puede cambiar




desafortunadamente.
> Cualquier sugerencia sera bien recibida.
>
> De antemano Gracias
> @dece
>
>
>
>
> "Maxi" wrote:
>
>> Hola, pero porque no me explicas bien que necesitas




hacer y vemos como
>> sacar
>> ese cursor ;)
>>
>>
>> Salu2
>> Maxi
>>
>>
>> "@dece" escribió en




el mensaje
>>




news:
>> > Gracias Maestro Maxi
>> >
>> > Me toco hacer un cursor.
>> > Lo siento mucho por el server :(
>> >
>> > @dece
>> >
>> > "Maxi" wrote:
>> >
>> >> Hola, no te entendi que es lo que buscas resolver :(
>> >>
>> >>
>> >> Salu2
>> >> Maxi
>> >>
>> >>
>> >> "@dece" escribió




en el mensaje
>> >>




news:
>> >> > Hola buenos Dias,
>> >> >
>> >> >
>> >> > Ante todo quiero aclarar que para nada soy amigo




de los cursores en
>> >> > SQL,
>> >> > sin
>> >> > embargo esta vez creo que no me queda otra




salida :(. A ver tengo
>> >> > dos
>> >> > tablas,
>> >> > Nomina y Transaccion, las dos tienen datos




parecidos, sin embargo
>> >> > no
>> >> > estan
>> >> > relacionadas.
>> >> >
>> >> > La consulta en Transaccion es:
>> >> >
>> >> > SELECT t.TipoServicio,t.TipoPago,




t.NumeroAfiliacion,
>> >> > t.Identificacion,
>> >> > t.Periodo AS FechaMesada, t.TipoCuenta,




t.NumeroCuenta,
>> >> > t.NumeroCheque,
>> >> > (ISNULL(t.ValorEfectivo,0) +




ISNULL(t.ValorCheque,0)) AS
>> >> > ValorPago, t.TipoTransaccion, t.codigocaja
>> >> > FROM Transaccion t where
>> >> > CONVERT(CHAR(8),FechaHoraTransaccion,112)
>> >> > Between '20040802' AND '20040802',
>> >> >
>> >> > para esta consulta (369) registros
>> >> >
>> >> > Ahora, necesito ponerle nombre a la




identificacion con lo cual le
>> >> > agrego
>> >> > a
>> >> > toda la sentencia y queda asi:
>> >> >
>> >> > inner join
>> >> > (SELECT DISTINCT TOP 100 percent




CONVERT(BIGINT,IDENTIFICACION)
>> >> > IDENTIFICACION,
>> >> > LEFT( Rtrim(Ltrim(Nombres)) + ' ' +




Rtrim(LTRIM(PrimerApellido)) +
>> >> > ' '
>> >> > +
>> >> > Rtrim(Ltrim(SegundoApellido)) + REPLICATE('




',50) ,50)CustName
>> >> > FROM NOMINA ) N
>> >> > ON N.IDENTIFICACION = t.IDENTIFICACION
>> >> > WHERE




CONVERT(CHAR(8),FechaHoraTransaccion,112) Between '20040802'
>> >> > AND
>> >> > '20040802'
>> >> >
>> >> > Al hacer esto, arroja un resultado de 371




registros, por que puede
>> >> > haber
>> >> > en
>> >> > transaccion una identificacion con varios




numeros de afiliacion. Se
>> >> > que
>> >> > no
>> >> > es
>> >> > un diseà±o correcto de las tablas pero no se




pueden cambiar.
>> >> >
>> >> > Alguna sugerencia ??
>> >> >
>> >> > Gracias a todos de antemano
>> >> > @dece
>> >>
>> >>
>> >>
>>
>>
>>





.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida