Actualizar de la misma tabla

15/08/2007 - 22:42 por Eduardo Antonio | Informe spam
Buenaa a todos soy nuevo por aqui

tengon una tabla temporar(#bal) que la creo en procedimiento almacenado
hasta aqui to ok, pero ahora quiero actualizar de la misma tabla
ya que tengo una columna codcuenta, codpadre y valor
el valor se le tiene que sumar a la cueta padre y asi asta que sea =" 0 "

gracias por cualquiere sugerencia
Ej.
#bal
nombre codcta ctapadre valor
x1 1 0 0
x2 11 1 0
x3 111 11 25
x4 112 11 0
x41 1121 112 5
x42 1121 112 5
x3 12 1 0
x4 121 12 10

deberia quedar
#bal
nombre codcta ctapadre valor
x1 1 0 45 (35+10)

x2 11 1 35 (10+25)
x3 111 11 25
x4 112 11 10 (5+5)
x41 1121 112 5
x42 1121 112 5
x3 12 1 10 (10)
x4 121 12 10

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera (MVP)
15/08/2007 - 23:16 | Informe spam
Le recomiendo este artículo para obtener ideas:

Trees in SQL
http://www.intelligententerprise.co...estid75349

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Eduardo Antonio" wrote:

Buenaa a todos soy nuevo por aqui

tengon una tabla temporar(#bal) que la creo en procedimiento almacenado
hasta aqui to ok, pero ahora quiero actualizar de la misma tabla
ya que tengo una columna codcuenta, codpadre y valor
el valor se le tiene que sumar a la cueta padre y asi asta que sea =" 0 "

gracias por cualquiere sugerencia
Ej.
#bal
nombre codcta ctapadre valor
x1 1 0 0
x2 11 1 0
x3 111 11 25
x4 112 11 0
x41 1121 112 5
x42 1121 112 5
x3 12 1 0
x4 121 12 10

deberia quedar
#bal
nombre codcta ctapadre valor
x1 1 0 45 (35+10)

x2 11 1 35 (10+25)
x3 111 11 25
x4 112 11 10 (5+5)
x41 1121 112 5
x42 1121 112 5
x3 12 1 10 (10)
x4 121 12 10

Respuesta Responder a este mensaje
#2 Alejandro Mesa
15/08/2007 - 23:30 | Informe spam
Hola Eduardo,

Es recomendable que para este tipo de problema / pregunta, se postee la
estructura de las tablas, incluyendo indices y restricciones, asi como data
de ejemplo en forma de sentencias "insert" y resultado esperado. La ayuda
debe ser mutua, no crees?

Cual version de SQL Server estas usando?

Te lo pregunto porque en versiones < 2005, no contamos con query recursivo,
por lo que tendras que expandir la jerarquia de forma procedural. Si estas
trabajando con 2005, entonces podemos hacer uso de las CTE recursivas.

Ejemplo:

use tempdb
go

create function dbo.hijos_proc (
@ctapadre varchar(25)
)
returns @t table (
nombre varchar(25),
codcta varchar(25),
ctapadre varchar(25),
valor int,
lvl int
)
as
begin
declare @lvl int

set @lvl = 1

insert into @t(nombre, codcta, ctapadre, valor, lvl)
select nombre, codcta, ctapadre, valor, @lvl
from dbo.t1
where ctapadre = @ctapadre

set @lvl = @lvl + 1

while exists (
select *
from dbo.t1 as a inner join @t as b on a.ctapadre = b.codcta and b.lvl =
@lvl - 1
)
begin
insert into @t(nombre, codcta, ctapadre, valor, lvl)
select a.nombre, a.codcta, a.ctapadre, a.valor, @lvl
from dbo.t1 as a inner join @t as b on a.ctapadre = b.codcta and b.lvl =
@lvl - 1

set @lvl = @lvl + 1
end

return
end
go

create function dbo.hijos_cte (
@ctapadre varchar(25)
)
returns @t table (
nombre varchar(25),
codcta varchar(25),
ctapadre varchar(25),
valor int,
lvl int
)
as
begin
declare @lvl int

set @lvl = 1

;with cte
as
(
select
nombre, codcta, ctapadre, valor, @lvl as lvl
from
dbo.t1
where
ctapadre = @ctapadre

union all

select
a.nombre, a.codcta, a.ctapadre, a.valor, b.lvl + 1 as lvl
from
dbo.t1 as a
inner join
cte as b
on a.ctapadre = b.codcta
)
insert into @t(nombre, codcta, ctapadre, valor, lvl)
select nombre, codcta, ctapadre, valor, lvl
from cte

return
end
go

create table dbo.t1 (
nombre varchar(25) not null unique,
codcta varchar(25) not null primary key,
ctapadre varchar(25) references dbo.t1(codcta),
valor int
)
go

set nocount on
insert into dbo.t1 values('x1', '1', null, 0)
insert into dbo.t1 values('x2', '11', '1', 0)
insert into dbo.t1 values('x3', '111', '11', 25)
insert into dbo.t1 values('x4', '112', '11', 0)
insert into dbo.t1 values('x41', '1121', '112', 5)
insert into dbo.t1 values('x42', '1122', '112', 5)
insert into dbo.t1 values('x5', '12', '1', 0)
insert into dbo.t1 values('x6', '121', '12', 10)
set nocount off
go

update dbo.t1
set valor = isnull((select sum(valor) from dbo.hijos_proc(dbo.t1.codcta)),
valor)
go

select *
from dbo.t1
order by codcta
go

truncate table dbo.t1
go

set nocount on
insert into dbo.t1 values('x1', '1', null, 0)
insert into dbo.t1 values('x2', '11', '1', 0)
insert into dbo.t1 values('x3', '111', '11', 25)
insert into dbo.t1 values('x4', '112', '11', 0)
insert into dbo.t1 values('x41', '1121', '112', 5)
insert into dbo.t1 values('x42', '1122', '112', 5)
insert into dbo.t1 values('x5', '12', '1', 0)
insert into dbo.t1 values('x6', '121', '12', 10)
set nocount off
go

update dbo.t1
set valor = isnull((select sum(valor) from dbo.hijos_cte(dbo.t1.codcta)),
valor)
option (maxrecursion 0)
go

select *
from dbo.t1
order by codcta
go

drop function dbo.hijos_proc, dbo.hijos_cte
go

drop table dbo.t1
go

Esto y mucho mas puedes aprender de los libros:

- Inside SQL Server 2005: T-SQL Querying
- Inside SQL Server 2005: T-SQL Programming


AMB

"Eduardo Antonio" wrote:

Buenaa a todos soy nuevo por aqui

tengon una tabla temporar(#bal) que la creo en procedimiento almacenado
hasta aqui to ok, pero ahora quiero actualizar de la misma tabla
ya que tengo una columna codcuenta, codpadre y valor
el valor se le tiene que sumar a la cueta padre y asi asta que sea =" 0 "

gracias por cualquiere sugerencia
Ej.
#bal
nombre codcta ctapadre valor
x1 1 0 0
x2 11 1 0
x3 111 11 25
x4 112 11 0
x41 1121 112 5
x42 1121 112 5
x3 12 1 0
x4 121 12 10

deberia quedar
#bal
nombre codcta ctapadre valor
x1 1 0 45 (35+10)

x2 11 1 35 (10+25)
x3 111 11 25
x4 112 11 10 (5+5)
x41 1121 112 5
x42 1121 112 5
x3 12 1 10 (10)
x4 121 12 10

Respuesta Responder a este mensaje
#3 Eduardo Antonio
15/08/2007 - 23:53 | Informe spam
gracias, aunque mi ingles no es muy bueno :-)

otra consulta se puede en sql rrecorer una tabla (registro por registro)

gracias

Gustavo Larriera (MVP) escribió:
Le recomiendo este artículo para obtener ideas:

Trees in SQL
http://www.intelligententerprise.co...estid75349


Respuesta Responder a este mensaje
#4 Eduardo Antonio
16/08/2007 - 01:01 | Informe spam
Muchas Gracias :-) :-)

para la proxima vez ya se
Respuesta Responder a este mensaje
#5 Gustavo Larriera (MVP)
16/08/2007 - 04:19 | Informe spam
Si no hay otra forma de hacerlo, se puede recorrer una tabla registro a
registro, usando cursores. En general es una forma de hacer las cosas
que resultan en pobre rendimiento en SQL Server.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.Larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.

In article ,
says...
gracias, aunque mi ingles no es muy bueno :-)

otra consulta se puede en sql rrecorer una tabla (registro por registro)

gracias

Gustavo Larriera (MVP) escribió:
> Le recomiendo este artículo para obtener ideas:
>
> Trees in SQL
> http://www.intelligententerprise.co...estid75349
>
>

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