PDA

View Full Version : نوشتن stored procedure



myexir
دوشنبه 22 مهر 1387, 21:50 عصر
سلام
من در نوشتن sp زیر مشکل دارم. لطفا هرکس میتونه کمک کنه:
یک table داریم با فیلدهای id-Num-Turn . می خواهم sp ای بنویسم که num های هر سطر را با هم جمع کند و تا جایی که کمتر از 5 است در فیلد turn عدد n (مثلا یک) را وارد کند.وقتی که مجموع بیشتر از 5 شد دوباره شروع به شمارش num کند و تا حایی که کمتر از 5 است turn را n+1 بگذارد. و به همین ترتیب تا آخرین سطر جدول.
مثال:
Id - Num -Turn
1 - 3 - 1
1 - 1 - 2
2 - 4 - 3
3 - 2 - 4
1 - 1 - 5
3 - 3 - 6
4 - 2 - 7
2 - 1 - 8

امیدوارم تونسته باشم خوب بیان کرده باشم که چی میخوام.
چطوری باید بگیم هر سطر رو چک کنه جمع num ها رو محاسبه کنه؟ من که چیزی به ذهنم نمی رسه. هرکس که میدونه این sp چطور نوشته میشه لطفا کمک کنه.

Itist82
دوشنبه 22 مهر 1387, 22:37 عصر
چطوری باید بگیم هر سطر رو چک کنه جمع num ها رو محاسبه کنه؟

ببخشید مگه هر سطر چند تا فیلد num داره؟! چیزی که نوشتید مگه اسم ستون ها و بعد به تعداد 8 تا سطر نیست؟ هر سطر که یه دونه فیلد nNumداره؟
اگه منظورتون اینه که هر سطر رو افقی بگیریم فکر کنم شبیه این حدودا کار کنه:




select sum(num) as s , Turn=
CASE
WHEN s<5 THEN '1'
WHEN s>=5 THEN '2'
END
from tableName




ولی اگه دقیق تر بگید بهتر می شه جواب داد

myexir
سه شنبه 23 مهر 1387, 09:10 صبح
بله هر سطر یکدونه num داره. میخوام num هر سطر رو به ترتیب با سطر های بعدی جمع کنه تا بشه 5 و اگه sum (مجموع num ها) هنوز کوچکتر از 5 بود ولی با جمع با num سطر بعد بزرگتر از 5 میشد اون سطر رو بیخیال بشه (یعنی turn اش رو بذاره تو نوبت بعد(turn=نوبت)) و بره سطر های دیگه رو چک کنه تا sum بشه 5 . بعد turn رو توی فیلد turn پر کنه. بعد دوباره turn بعدی رو هم همینطور 5تا 5تا نوبت دهی کنه.

نمی دونم با توضیحم مسئله رو روشن کردم یا پیچیده ترش کردم ولی امیدوارم متوجه شده باشید ماجرا از چه قراره.
ممنون

Itist82
سه شنبه 30 مهر 1387, 20:04 عصر
سلام همون طور که قول دادم روی کوئری شما کار کردم و به نتایجی رسیدم البته با یه سری فرضیات خودم. من فرض کردم بخواهیم فیلد turn همه ی سطر ها رو تغییر بدیم، جوری که برابر با مجموع فیلد num سطر های بعدی بشه به شرطی که اون مجموع بیشتر از 5 نباشه. من دوتا stored procedure نوشتم که اولی مقدار turn رو حساب می کنه و دومی با صدا زدن اولی اون مقدار رو توی فیلد Turn همه ی سطر ها می ذاره.
من یه کار ناجالب کردم! اونم اینکه فرض کردم اولا id کلید اصلیه، ثانیا از 1 شروع می شه و کاملا بی نقص یکی یکی زیاد می شه به نحوی که فیلد id آخرین رکورد مقدارش برابر تعداد رکورد هاست. به این خاطر که بتونم حلقه بزنم و یکی یکی توی رکورد ها پیش برم. بهتر بود به جای این کار یکی از دستورات sql رو استفاده می کردم که برای همین منظوره اما فراموشش کردم و منبعی دم دستم نبود که پیداش کنم. اگه فرصت کردید این کار رو بکنید.