PDA

View Full Version : تغییر مقدار یک cell بسته به مقدار Cell دیگه



Mahdi_20
دوشنبه 12 بهمن 1388, 10:08 صبح
سلام
من یه SP نوشتم که خروجی او یه جدول با نام tb هست حالا میخوام از اول مقدار یک سلول(x) از سطر قبلی رو بخونم و به اضافه ی مقدار یک سلول(y) دیگه از سطر جاری کنم و مقدار نهایی رو دوباره در سلول(x) بریزم ..
x | y
--|--
5 | 1
8 | 3
9 | 1
15 | 6
x حالا
چطوری این کار رو انجام بدم؟؟

محمد سلیم آبادی
دوشنبه 12 بهمن 1388, 19:08 عصر
سلام،
امکان داره کمی بیشتر توضیح بدین و یک مثال واضح تر بنویسید؟

Mahdi_20
سه شنبه 13 بهمن 1388, 07:43 صبح
من میخوام تو یه دستور Select هنگام خواندن و نمایش هر سطر یه لینک هم به سطر قبل داشته باشم تا بتونم یه مقداری رو از اون بخونم و با مقادیری در سطر جاری، محاسباتی انجام بدم و در یک سلول از سطر جاری قرار بدم

مثلا در جدول بالا اگر اشاره گر در سطر 2 باشد، مقدار 5 از ستون x را، از سطر قبل (1) بخونم و با مقدار 3 از ستون y در سطر جاری(2) جمع کنم و در ستون x از سطر جاری بریزم..(عدد 8 در سطر 2 و ستون x)

امیدوارم متوجه منظور من شده باشید.

محمد سلیم آبادی
سه شنبه 13 بهمن 1388, 08:14 صبح
این کار را با کمک یک حلقه و یک update می توانید به سادگی انجام بدهید. ولی پیشنهاد می کنم در همین سایت با کلید واژه ی assignment update یک جستجو انجام بدهین.

الان از loop برای حل این مساله استفاده کردم:


set nocount on
Declare @t table
(id int,
x int,
y int)
--====================
Insert into @t values (1,5,1)
Insert into @t values (2,0,3)
Insert into @t values (3,0,1)
Insert into @t values (4,0,6)
--====================
declare @i int
set @i = 1;
--====================
while @i <= (select count(*) from @t)
begin
if @i>1
update @t
set x=(select x
from @t t2
where t2.id = t1.id - 1) + t1.y
from @t t1
where id = @i
set @i=@i+1;
end
--====================
select * from @t
--====================
/*
id x y
----------- ----------- -----------
1 5 1
2 8 3
3 9 1
4 15 6
*/

Mahdi_20
سه شنبه 13 بهمن 1388, 14:13 عصر
نمیشه این کار رو با Cursor انجام داد!؟ چطوری؟!

محمد سلیم آبادی
سه شنبه 13 بهمن 1388, 17:50 عصر
اینم راه حل با Cursor البته با قدرت مانور بیشتر، یعنی کافیه فقط id جدولت بصورت افزایشی باشد:


set nocount on
Declare @t table
(id int,
x int,
y int)
--====================
Insert into @t values (101,5,1)
Insert into @t values (202,0,3)
Insert into @t values (303,0,1)
Insert into @t values (404,0,6)
--====================
Declare @id int;

Declare C Cursor
For Select id
From @t
Order By id ASC;

OPEN C;

FETCH NEXT FROM C INTO @id;

WHILE (@@FETCH_STATUS=0)
BEGIN
if @id > (Select min(id)
from @t)
update @t
set x=(select x
from @t t2
where t2.id = (select max(id)
from @t t3
where t3.id < t1.id)) + t1.y
from @t t1
where id = @id


FETCH NEXT FROM C INTO @id
END
CLOSE C
DEALLOCATE C

Select *
From @t
/*
id x y
----------- ----------- -----------
1 5 1
2 8 3
3 9 1
4 15 6
*/