PDA

View Full Version : جمع یک فیلد با شرایط خاص در فیلد دیگر



mr.siahatgar
شنبه 26 شهریور 1390, 13:33 عصر
با سلام
من یه جدول تو sql دارم که از سه فیلد به نام نام کالا و تاریخ فروش و مبلغ فروش تشکیل شده - من 31 روز که بشود یک ماه کالاهایی را فروخته ام و این نکته هم بگم که در هر روز فقط 3 کالا فروخته ام نه کمتر و نه بیشتر- حالا مشکل من این است که میخوام یه فیلد دیگه اضافه کنم که جمع مبلغ هر روز در اخرین رکورد ان روز قرار بده مثلا 8 رکورد دارم که در روز یکم کالا فروخته شده - حالا میخوام جمع فروش 8 کالایی که در یکم فروخته شده در فیلد جمع مبالغ روزانه دررکورد اخر همان روز قرار بگیره و برای روز دوم و الی الاخر
ممنون میشم راهنمایی کنید
مثال
نام کالا ---------------تاریخ فروش------------------- مبلغ فروش--------------------- جمع کل فروش روزانه
کتاب 1 --------------- 1/1/90 ------------------------- 250
کتاب 2 --------------- 1/1/90 ------------------------- 150
کتاب 3 --------------- 1/1/90 ------------------------- 100 ----------------------------500
کتاب 4 --------------- 2/1/90 ------------------------- 300
کتاب 5 --------------- 2/1/90 ------------------------- 250
کتاب 6 --------------- 2/1/90 ------------------------- 150 -------------------------700

morteza271
شنبه 26 شهریور 1390, 13:49 عصر
برای این کار به نظر من بهتره که این کار رو بکنید :
هر بار که یه سطر جدید Insert می کنید چک کنید اگه اولین فروش امروز هست که مبلغ فروش رو در ستون جمع کل فروش روزانه هم ذخیره کنید ولی اگه اولی نیست مقدار فروش رو با مقدار جمع کل فروش روزانه سطر قبلی(فروش قبلی) جمع کنید و در ستون جمع کل فروش روزانه ذخیره کنید.

البته کلا به نظرمن این کار رو نکنید بهتره یعنی به نظر من این ستون رو نذارین بهتره و به جای اینکه این ستون رو قرار بدین این کار رو بکنید :
در هر جایی که میخواهین جمع کل فروش روزانه رو نمایش بدین یه کوئری بزنید که ستون مبلغ فروش تمام سطرهای تاریخ مورد نظر رو باهم جمع کنه.

این کاری که میخواهین شما بکنین اصلا منطقی نیست و احتمال بوجود اومدن خطا رو افزایش میده!

به هر حال اگه خواستین ستون جمع کل فروش روزانه رو بذارین میتونید از روشی که گفتم استفاده کنید.
موفق باشید

mr.siahatgar
شنبه 26 شهریور 1390, 14:23 عصر
با تشکر از شما
ولی من میدونم که بهترین روش کوئری هست که با group by بنویسیم ولی بعد چطوری میتونم نتایج این کوئری را در جدول ذخیره کنم اخه بعد دوباره این اعداد مورد نیازم هست در جایی دیگه

morteza271
شنبه 26 شهریور 1390, 14:41 عصر
گفتم که هرجا نیازتون بود دوباره همین کوئری یا یه کوئری دیگه برحسب نیازتون اجرا می کنید و نیازی نیست جمع قیمت ها رو ذخیره کنید.
یکی دیگه از مشکلاتی که برائتن پیش میاد در زمان ویرایش کردن یکی از سطرهاست که در این زمان باز دوباره باید ستون جمع قیمت رو حساب و ذخیره کنید.

به نظر من که استفاده از کوئری(مساحبه جمع قیمت ها در زمان نیاز) بهترین راهه البته اگه بقیه دوستان هم نظری دارن استقبال میکنم.

Reza_Yarahmadi
شنبه 26 شهریور 1390, 18:42 عصر
به جای اینکه یک فیلد جدید درست کنید و جمع فروش رو توی اون نگه دارید یک View درست کنید که نتیجه مورد نظرتون رو تولید کنه بعد هر جایی که نیاز به این مقدار داشتید از این View بخونید. البته بستگی به میزان نیاز شما به این مقدارها داره ، اگر نیاز شما به این مقدارها خیلی زیاد (مثلا به ازا هر کاربر روزانه بیش از 100 بار) و یا تعداد رکوردهای این جدول خیلی زیاد (بازهم برای مثال بیش از 1000000 رکورد) وهمچنین سرعت محاسبه هم برای شما بسیار مهم است اضافه کردن یک فیلد ممکنه به صرفه تر باشه.
برای درست کردن View میتونید از دستور زیر کمک بگیرید.
چند داده نمونه و دستور :
With tbl as(
Select ID = 1, BookName = 'Book 1', SellDate = '1390/06/24', Price = 200
UNION ALL
Select ID = 2, BookName = 'Book 2', SellDate = '1390/06/24', Price = 150
UNION ALL
Select ID = 3, BookName = 'Book 3', SellDate = '1390/06/24', Price = 100
UNION ALL
Select ID = 4, BookName = 'Book 4', SellDate = '1390/06/25', Price = 50
UNION ALL
Select ID = 5, BookName = 'Book 5', SellDate = '1390/06/25', Price = 350
UNION ALL
Select ID = 6, BookName = 'Book 6', SellDate = '1390/06/25', Price = 425
UNION ALL
Select ID = 7, BookName = 'Book 7', SellDate = '1390/06/26', Price = 120
UNION ALL
Select ID = 8, BookName = 'Book 8', SellDate = '1390/06/26', Price = 200
UNION ALL
Select ID = 9, BookName = 'Book 9', SellDate = '1390/06/26', Price = 200
)
Select
T1.ID,
T1.BookName,
T1.SellDate,
T1.Price,
T2.TotalSellPrice
From
tbl T1 Left Outer JOIN (Select
MAX(ID) AS ID,
SUM(Price) AS TotalSellPrice
From
tbl
Group By
SellDate) T2
ON
T1.ID = T2.ID

seven7777777
شنبه 26 شهریور 1390, 22:10 عصر
یک روش رو که استاد عزیز گفتن VIEW هست و بسیار روش خوبیه . اما اگه واقعا می خواهید مقدار رو نگه دارید و مجاب به انجام این کار هستید ، یک جدول دیگه باید ایجاد کنید که دارای دو ستون هست . یکی تاریخ و دیگری جمع کل اون تاریخ .
حالا در ادامه می تونید از یک Trigger هم استفاده کنید تا اگر احتمالا تغییری در جدول پایه ایجاد شد ، به طور خودکار این جدول هم به روز بشه . به نظر من این روش هم روش بسیار خوب و منطقی هست .
موفق باشید