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

#1 Maxi
21/12/2004 - 16:56 | Informe spam
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
#2 Anonimo
21/12/2004 - 17:33 | Informe spam
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
#3 Maxi
21/12/2004 - 18:10 | Informe spam
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
#4 Anonimo
21/12/2004 - 20:59 | Informe spam
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
#5 Maxi
21/12/2004 - 21:08 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida