PDA

View Full Version : صفر کردن فیلدهای تکراری به جز اولی



Sal_64
پنج شنبه 29 مهر 1389, 11:06 صبح
سلام
یه تیبل داریم با 3000 رکورد و 250 شماره عضویت و 10 دوره
با فیلد شماره عضویت- شماره دوره- مبلغ- تاریخ - ....

بر طبق شماره عضویت و شماره دوره یه سری از فیلدهای مبلغ مشترک(تکراری) هستند
چطور میشه بر طبق شماره عضویت و شماره دوره از بینشون یکی از فیلدهای تکراری همون مبلغ بماند و مابقی صفر شود

مثلا :
شماره عضویت- شماره دوره -مبلغ - تاریخ- ...
10- 1- 100 -81
10- 1 -100- 82
10- 1- 100- 83
10- 1- 50- 84

تبدیل بشه به
شماره عضویت- شماره دوره - مبلغ- تاریخ- ...
10- 1- 100 - 81
10 - 1 - 0 - 82
10 - 1- 0 - 83
10 - 1- 50 - 84

دوستان میتونن راهنمایی کنن؟
با تشکر

fghdmhmmd
پنج شنبه 29 مهر 1389, 12:45 عصر
سلام.شما ميتونيد يه Select بر اساس شماره عضويت و شماره دوره مورد نظر بگيريد بعدش اين Select رو داخل يه DataTable بريزيد.بعدش با يه حلقه For كه از ايندكس 1 شروع ميشه ( نه از صفر ) يه دستور Update بسازيد و اجراش كنيد.

m_omrani
پنج شنبه 29 مهر 1389, 13:23 عصر
البته شما هر جا ديديد يه ديتاي تکراري داريد بايد نسبت به طراحي تون يک علامت سوال براتون مطرح بشه نکنه يک وقت ديتابيسي که طراحي کرديد نرمال نباشه که به نظرم ساختاري هم که مي گيد اين طوره. اما به هر حال مشکلي نيست و در ساختار غير نرمال هم به هر حال با وجود افزونگي ديتا مي شه باز هم کار کرد و مشکلي هم پيش نمياد (ضمن اين که در برخي موارد، دقت کنيد، برخي موارد خاص(!)، نه همه موارد، بهتره غير نرمال کار بشه). و يا ممکنه در شرايطي قرار داشته باشيد که بدونيد سيستم غير نرماله اما نمي تونيد کاريش بکنيد (مثلاً يکي ديگه مدتها قبل طراحي کرده و سيستم در حال کاره و ...).

anyway!!

بعد از تمام اين داستان ها و مقدمات من براي سوال شما اسکريپت زير رو پيشنهاد مي دم:


create table #x(ID int identity(1,1) not null,[Year] int,Cost int, Serial int,MembershipNo int)

insert into #x([Year],Cost,Serial,MembershipNo) values (81,100,1,10)
insert into #x([Year],Cost,Serial,MembershipNo) values (82,100,1,10)
insert into #x([Year],Cost,Serial,MembershipNo) values (83,100,1,10)
insert into #x([Year],Cost,Serial,MembershipNo) values (84,50,1,10)
insert into #x([Year],Cost,Serial,MembershipNo) values (81,200,1,20)
insert into #x([Year],Cost,Serial,MembershipNo) values (82,200,1,20)
insert into #x([Year],Cost,Serial,MembershipNo) values (83,150,1,20)
insert into #x([Year],Cost,Serial,MembershipNo) values (84,150,1,20)

select
x1.[Year],
(
select top 1 case when x2.ID = x1.ID then x2.Cost else 0 end
from #x x2 where x2.MembershipNo = x1.MembershipNo and x2.Serial = x2.Serial and x2.Cost = x1.Cost
),
x1.Serial,
x1.MembershipNo
from #x x1

drop table #x



اجراي اين اسکريپت دقيقاً چيزي که مي خوايد رو بهتون مي ده.

يک نکته مهم اينه که حتماً جدولتون بايد کليد اصلي داشته باشه که به ازاي هر رکورد مقدار منحصر به فرد داشته باشد که من در اينجا اسمش رو ID گذاشتم.

good luck

Sal_64
جمعه 30 مهر 1389, 17:47 عصر
سلام

تشکر fghdmhmmd (http://barnamenevis.org/forum/member.php?u=46622)
بدلیل اینکه بنده می بایست در محل اینکار رو انجام بدم
پس تنها باید به روش های مبتنی بر بانک داده عمل کنم


دوست گرامی m_omrani خدا امواتت رو بیامرزه .