Actualizar sólo 1 fila

25/11/2003 - 20:48 por CAFC | Informe spam
Estimados:
Tengo un problema que me tiene cansadisimo... tengo una
tabla temporal que es generada por un enorrrrrrme conjunto
de select. el tema es que ahora necesito asociar un monto
pero solo a la prmera fila de cada grupo de registros. o
sea tengo lo siguiente:
CLI PROD DESC
Cliente1 Prod1 Descrip1
Cliente1 Prod1 Descrip2
Cliente1 Prod1 Descrip3
Cliente2 Prod1 Descrip1
Cliente2 Prod1 Descrip2
Cliente2 Prod1 Descrip3

a esto le deboa gregar una nueva columna que corresponde a
un monto asociado al cliente, no al producto (para luego
manejarlo en Crystal report), o sea quiero que me devuelva
lo siguiente:

CLI PROD DESC MONTO
Cliente1 Prod1 Descrip1 500
Cliente1 Prod1 Descrip2 0
Cliente1 Prod1 Descrip3 0
Cliente2 Prod1 Descrip1 1300
Cliente2 Prod1 Descrip2 0
Cliente2 Prod1 Descrip3 0

O sea solo necesito un valor por cada grupo de cliente,
ojala me haya explicado bien.
Alguna sugerencia de como hacerlo?

Saludos y gracias.
Cristian.

Preguntas similare

Leer las respuestas

#1 ulises
25/11/2003 - 22:26 | Informe spam
Sí tienes forma de identificar plenamente a los registros
en base a la combinación de campos te aconsejaría realizar
un join entre esa tabla y la tabla que tiene los importes.
En caso que la tabla tenga los registros duplicados la
única forma de actualizar solo un registro del grupo
duplicado es a través de un proceso row-by-row (o sea un
cursor), si se trata de un reporte que se generará
bastante esporádicamente tal vez valga la pena pero si
formará parte de tu proceso diario te aconsejaría que
busques otra alternativa; en todo caso un ejemplo de como
se actualizaría sería :

create table tabla ( clave char(1), cantidad int )
go
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
go

DECLARE @cla as char(1)
DECLARE @old as char(1)

SET @old = ' '

DECLARE tabla_cursor CURSOR FOR
SELECT clave FROM tabla
FOR UPDATE OF cantidad

OPEN tabla_cursor

FETCH NEXT FROM tabla_cursor INTO @cla
WHILE @@FETCH_STATUS = 0
BEGIN
Print @cla
Print @old
IF @cla <> @old UPDATE tabla SET cantidad = 300
WHERE CURRENT OF tabla_cursor
SET @old = @cla
FETCH NEXT FROM tabla_cursor INTO @cla
END

CLOSE tabla_cursor
DEALLOCATE tabla_cursor

Resultados :

clave cantidad
A 300
A 0
A 0
A 0
A 0
B 300
B 0
B 0
B 0
C 300
C 0
C 0
C 0

(13 row(s) affected)



Saludos,
Ulises

Estimados:
Tengo un problema que me tiene cansadisimo... tengo una
tabla temporal que es generada por un enorrrrrrme


conjunto
de select. el tema es que ahora necesito asociar un monto
pero solo a la prmera fila de cada grupo de registros. o
sea tengo lo siguiente:
CLI PROD DESC
Cliente1 Prod1 Descrip1
Cliente1 Prod1 Descrip2
Cliente1 Prod1 Descrip3
Cliente2 Prod1 Descrip1
Cliente2 Prod1 Descrip2
Cliente2 Prod1 Descrip3

a esto le deboa gregar una nueva columna que corresponde


a
un monto asociado al cliente, no al producto (para luego
manejarlo en Crystal report), o sea quiero que me


devuelva
lo siguiente:

CLI PROD DESC MONTO
Cliente1 Prod1 Descrip1 500
Cliente1 Prod1 Descrip2 0
Cliente1 Prod1 Descrip3 0
Cliente2 Prod1 Descrip1 1300
Cliente2 Prod1 Descrip2 0
Cliente2 Prod1 Descrip3 0

O sea solo necesito un valor por cada grupo de cliente,
ojala me haya explicado bien.
Alguna sugerencia de como hacerlo?

Saludos y gracias.
Cristian.
.

Respuesta Responder a este mensaje
#2 CAFC
25/11/2003 - 22:40 | Informe spam
Gracias Ulises por tu sugerencia.
Efectivamente había pensado la posibilidad de un cursor,
pero como justamente es un reporte que pueden correr los
usuarios en cualquier minuto (app 1000 usuarios
conectados), sumado a este dato el hecho de que ya existe
un enorme conjunto de select (SP de app 600 líneas) y
sumado a todo esto la seríe de calculos que realiza hiba a
demorar demaciado tiempo, entiendo que el uso de cursores
es lento. Es por eso que estoy esquivando el usar
cursores, pero si no encuentro rápido otra solución tendré
que usarlos.

Desde ya muchas gracias por tu comentario y cualquier otra
sugerencia es bienvenida.
Saludos y Gracias.
Cristian.

Sí tienes forma de identificar plenamente a los registros
en base a la combinación de campos te aconsejaría


realizar
un join entre esa tabla y la tabla que tiene los


importes.
En caso que la tabla tenga los registros duplicados la
única forma de actualizar solo un registro del grupo
duplicado es a través de un proceso row-by-row (o sea un
cursor), si se trata de un reporte que se generará
bastante esporádicamente tal vez valga la pena pero si
formará parte de tu proceso diario te aconsejaría que
busques otra alternativa; en todo caso un ejemplo de como
se actualizaría sería :

create table tabla ( clave char(1), cantidad int )
go
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
go

DECLARE @cla as char(1)
DECLARE @old as char(1)

SET @old = ' '

DECLARE tabla_cursor CURSOR FOR
SELECT clave FROM tabla
FOR UPDATE OF cantidad

OPEN tabla_cursor

FETCH NEXT FROM tabla_cursor INTO @cla
WHILE @@FETCH_STATUS = 0
BEGIN
Print @cla
Print @old
IF @cla <> @old UPDATE tabla SET cantidad = 300
WHERE CURRENT OF tabla_cursor
SET @old = @cla
FETCH NEXT FROM tabla_cursor INTO @cla
END

CLOSE tabla_cursor
DEALLOCATE tabla_cursor

Resultados :

clave cantidad
A 300
A 0
A 0
A 0
A 0
B 300
B 0
B 0
B 0
C 300
C 0
C 0
C 0

(13 row(s) affected)



Saludos,
Ulises

Estimados:
Tengo un problema que me tiene cansadisimo... tengo una
tabla temporal que es generada por un enorrrrrrme


conjunto
de select. el tema es que ahora necesito asociar un




monto
pero solo a la prmera fila de cada grupo de registros. o
sea tengo lo siguiente:
CLI PROD DESC
Cliente1 Prod1 Descrip1
Cliente1 Prod1 Descrip2
Cliente1 Prod1 Descrip3
Cliente2 Prod1 Descrip1
Cliente2 Prod1 Descrip2
Cliente2 Prod1 Descrip3

a esto le deboa gregar una nueva columna que corresponde


a
un monto asociado al cliente, no al producto (para luego
manejarlo en Crystal report), o sea quiero que me


devuelva
lo siguiente:

CLI PROD DESC MONTO
Cliente1 Prod1 Descrip1 500
Cliente1 Prod1 Descrip2 0
Cliente1 Prod1 Descrip3 0
Cliente2 Prod1 Descrip1 1300
Cliente2 Prod1 Descrip2 0
Cliente2 Prod1 Descrip3 0

O sea solo necesito un valor por cada grupo de cliente,
ojala me haya explicado bien.
Alguna sugerencia de como hacerlo?

Saludos y gracias.
Cristian.
.



.

Respuesta Responder a este mensaje
#3 Miguel Egea
25/11/2003 - 23:25 | Informe spam
Me he permitido modificar un poquito el script. Creo que satisface un poco
más tus requerimientos y no usa cursores.

DROP TABLE TABLA
GO
create table tabla ( clave char(1),descr char(10), cantidad int )
go
insert into tabla values ( 'A','desc 1',0 )
insert into tabla values ( 'A','desc 2',0 )
insert into tabla values ( 'A','desc 3',0 )
insert into tabla values ( 'A','desc 4',0 )
insert into tabla values ( 'B','desc 1',0 )
insert into tabla values ( 'B','desc 2',0 )
insert into tabla values ( 'B','desc 3',0 )
insert into tabla values ( 'B','desc 4',0 )
insert into tabla values ( 'C','desc 1',0 )
insert into tabla values ( 'C','desc 2',0 )
insert into tabla values ( 'C','desc 3',0 )
insert into tabla values ( 'C','desc 4',0 )
go
go
update tabla set cantidad=t2.monto from tabla inner join (
select clave,MIN(descr) descr,5500 as monto from tabla group by clave) t2
on tabla.clave=t2.clave and tabla.descr=t2.descr
go
select * from tabla



Espero que te sirva.
"CAFC" escribió en el mensaje
news:071901c3b39c$c771cd20$
Gracias Ulises por tu sugerencia.
Efectivamente había pensado la posibilidad de un cursor,
pero como justamente es un reporte que pueden correr los
usuarios en cualquier minuto (app 1000 usuarios
conectados), sumado a este dato el hecho de que ya existe
un enorme conjunto de select (SP de app 600 líneas) y
sumado a todo esto la seríe de calculos que realiza hiba a
demorar demaciado tiempo, entiendo que el uso de cursores
es lento. Es por eso que estoy esquivando el usar
cursores, pero si no encuentro rápido otra solución tendré
que usarlos.

Desde ya muchas gracias por tu comentario y cualquier otra
sugerencia es bienvenida.
Saludos y Gracias.
Cristian.

Sí tienes forma de identificar plenamente a los registros
en base a la combinación de campos te aconsejaría


realizar
un join entre esa tabla y la tabla que tiene los


importes.
En caso que la tabla tenga los registros duplicados la
única forma de actualizar solo un registro del grupo
duplicado es a través de un proceso row-by-row (o sea un
cursor), si se trata de un reporte que se generará
bastante esporádicamente tal vez valga la pena pero si
formará parte de tu proceso diario te aconsejaría que
busques otra alternativa; en todo caso un ejemplo de como
se actualizaría sería :

create table tabla ( clave char(1), cantidad int )
go
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'A',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'B',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
insert into tabla values ( 'C',0 )
go

DECLARE @cla as char(1)
DECLARE @old as char(1)

SET @old = ' '

DECLARE tabla_cursor CURSOR FOR
SELECT clave FROM tabla
FOR UPDATE OF cantidad

OPEN tabla_cursor

FETCH NEXT FROM tabla_cursor INTO @cla
WHILE @@FETCH_STATUS = 0
BEGIN
Print @cla
Print @old
IF @cla <> @old UPDATE tabla SET cantidad = 300
WHERE CURRENT OF tabla_cursor
SET @old = @cla
FETCH NEXT FROM tabla_cursor INTO @cla
END

CLOSE tabla_cursor
DEALLOCATE tabla_cursor

Resultados :

clave cantidad
A 300
A 0
A 0
A 0
A 0
B 300
B 0
B 0
B 0
C 300
C 0
C 0
C 0

(13 row(s) affected)



Saludos,
Ulises

Estimados:
Tengo un problema que me tiene cansadisimo... tengo una
tabla temporal que es generada por un enorrrrrrme


conjunto
de select. el tema es que ahora necesito asociar un




monto
pero solo a la prmera fila de cada grupo de registros. o
sea tengo lo siguiente:
CLI PROD DESC
Cliente1 Prod1 Descrip1
Cliente1 Prod1 Descrip2
Cliente1 Prod1 Descrip3
Cliente2 Prod1 Descrip1
Cliente2 Prod1 Descrip2
Cliente2 Prod1 Descrip3

a esto le deboa gregar una nueva columna que corresponde


a
un monto asociado al cliente, no al producto (para luego
manejarlo en Crystal report), o sea quiero que me


devuelva
lo siguiente:

CLI PROD DESC MONTO
Cliente1 Prod1 Descrip1 500
Cliente1 Prod1 Descrip2 0
Cliente1 Prod1 Descrip3 0
Cliente2 Prod1 Descrip1 1300
Cliente2 Prod1 Descrip2 0
Cliente2 Prod1 Descrip3 0

O sea solo necesito un valor por cada grupo de cliente,
ojala me haya explicado bien.
Alguna sugerencia de como hacerlo?

Saludos y gracias.
Cristian.
.



.

Respuesta Responder a este mensaje
#4 Javier Loria
25/11/2003 - 23:44 | Informe spam
Hola:
No se si te sirve algo como esto:
a) Crear una Tabla Adicional con los Campos: CLI, PROD, DESC y MONTO.
b) Llenarla con los Datos que requieres (No se de donde viene Monto, aqui
simplemente le pongo 100.00), y asumiendo que quieres asignarle el monto al
Menor de los Desc que es una forma de decir al primero cuando este ordenado.
(OJO a el uso del MIN y el GROUP BY).
INSERT NuevaTabla (CLI, PROD, DESC, MONTO)
SELECT CLI, PROD, MIN(DESC), 100.00
FROM Tabla
GROUP BY CLI, PROD
c) Luego haces UN JOIN entre las dos tablas: (OJO al uso del COALESCE y del
LEFT JOIN)
SELECT Tabla.CLI,
Tabla.PROD,
Tabla.DESC,
COALESCE(NuevaTabla.MONTO,0)
FROM Tabla LEFT JOIN NuevaTabla ON
Tabla.CLI=NuevaTabla.CLI
Tabla.PROD=NuevaTabla.PROD
Tabla.DESC==NuevaTabla.DESC

Espero se explique el codigo.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

CAFC escribio:
Estimados:
Tengo un problema que me tiene cansadisimo... tengo una
tabla temporal que es generada por un enorrrrrrme conjunto
de select. el tema es que ahora necesito asociar un monto
pero solo a la prmera fila de cada grupo de registros. o
sea tengo lo siguiente:
CLI PROD DESC
Cliente1 Prod1 Descrip1
Cliente1 Prod1 Descrip2
Cliente1 Prod1 Descrip3
Cliente2 Prod1 Descrip1
Cliente2 Prod1 Descrip2
Cliente2 Prod1 Descrip3

a esto le deboa gregar una nueva columna que corresponde a
un monto asociado al cliente, no al producto (para luego
manejarlo en Crystal report), o sea quiero que me devuelva
lo siguiente:

CLI PROD DESC MONTO
Cliente1 Prod1 Descrip1 500
Cliente1 Prod1 Descrip2 0
Cliente1 Prod1 Descrip3 0
Cliente2 Prod1 Descrip1 1300
Cliente2 Prod1 Descrip2 0
Cliente2 Prod1 Descrip3 0

O sea solo necesito un valor por cada grupo de cliente,
ojala me haya explicado bien.
Alguna sugerencia de como hacerlo?

Saludos y gracias.
Cristian.
Respuesta Responder a este mensaje
#5 ulises
26/11/2003 - 00:07 | Informe spam
Gracias Miguel por tu acotación, creo que es más acertado
que el mío en que asumí en que las descripciones pueden
ser iguales en cuyo caso la única forma de procesar es a
través de un cursor, y a eso apunta mi consulta: por
ejemplo si tengo una tabla de usuarios y tengo que usar
sp_adduser por cada uno de ellos no he encontrado una
forma diferente de hacerlo que usando un cursor pero esto
sigue cayendo dentro de la categoría de proceso "uno por
uno", ¿existe otro uso "justificado" de cursores en
procesos diferentes al proceso row-by-row?

Saludos desde Lima,
Ulises

Me he permitido modificar un poquito el script. Creo que


satisface un poco
más tus requerimientos y no usa cursores.

DROP TABLE TABLA
GO
create table tabla ( clave char(1),descr char(10),


cantidad int )
go
insert into tabla values ( 'A','desc 1',0 )
insert into tabla values ( 'A','desc 2',0 )
insert into tabla values ( 'A','desc 3',0 )
insert into tabla values ( 'A','desc 4',0 )
insert into tabla values ( 'B','desc 1',0 )
insert into tabla values ( 'B','desc 2',0 )
insert into tabla values ( 'B','desc 3',0 )
insert into tabla values ( 'B','desc 4',0 )
insert into tabla values ( 'C','desc 1',0 )
insert into tabla values ( 'C','desc 2',0 )
insert into tabla values ( 'C','desc 3',0 )
insert into tabla values ( 'C','desc 4',0 )
go
go
update tabla set cantidad=t2.monto from tabla inner join (
select clave,MIN(descr) descr,5500 as monto from tabla


group by clave) t2
on tabla.clave=t2.clave and tabla.descr=t2.descr
go
select * from tabla

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida