PDA

View Full Version : سوال: select و sum در ترکیب دو جدول



bahar_engineer
پنج شنبه 19 آذر 1388, 11:08 صبح
سلام

من دو تا جدول دارم : MyProducts و Details

MyProducts :
ProductID : کد محصول
salecounter : تعداد فروش رفته

Details:
ProductID : کد محصول
Quantity : تعداد خریداری شده


که در جدول details فیلد productid ممکنه توی چند سطر یکسان باشه یعنی این محصول رو چند نفر خریداری کردن و هر بار به تعداد quantity

حالا می خوام مجموع تعداد خرید هر محصول رو توی جدول details بدست بیارم (مثلا procductid 24 که محصول شماره 24 هست در سه ردیف از جدول و هر کدام به تعداد 1 عدد خریداری شده پس مجموع خرید محصول 24 می شه 3) و این مقدار رو توی فیلد salecounter از جدول MyProducts با همون Productid بریزم(در واقع باید این فیلد رو آپدیت کنم)

چطور دستور و بنویسم ؟
از inner join استفاده کردم اما خیلی پیچیده بود ... یه سری هم جدا اول مقدار مجموع رو بدست آوردم به ازای هر محصول و یه فیلد توی جدول details گذاشتم به اسم sumsale و مجموع رو توی اون ریختم ... و بعد اومدم اونو استخراج کنم و جدول myproducts رو آپدیت کنم ...


این کدها:


//sale counter
string at,sa,bb,kk;
OleDbConnection con = new OleDbConnection(@"provider=microsoft.jet.oledb.4.0;data source=" + Server.MapPath("shop.mdb"));
at = "SELECT sum(Quantity) As sumsale FROM Details Group By ProductID";
OleDbCommand cmm = new OleDbCommand(at, con);
con.Open();
cmm.ExecuteNonQuery();
con.Close();

//update database
bb = "SELECT MyProducts.salecounter,Details.sumsale FROM MyProducts Inner Join Details ON (MyProducts.ProductID = Details.ProductID)";
OleDbCommand cmup = new OleDbCommand(bb, con);
OleDbDataReader drup;
sa = "update MyProducts set salecounter='" + salecounter + "' where ProductID=" + Pid;
OleDbCommand cmdup = new OleDbCommand(sa, con);
con.Open();
drup = cmup.ExecuteReader();
if (drup.Read())
{
salecounter = int.Parse(drup["sumsale"].ToString());
Pid = int.Parse(drup["ProductID"].ToString());
cmdup.ExecuteNonQuery();
}
else
{
salecounter = 0;
cmdup.ExecuteNonQuery();
}
con.Close();
//

اما فکر نمی کنم این راه استاندارد باشه
گیج شدم لطفا کمک کنید

raziee
پنج شنبه 19 آذر 1388, 11:50 صبح
استاندارد بودنش رو که نمیدونم ولی اگه از LINQ استفاده کنی خیلی راحت تری.
به نظر من.
کداتون هم واضح تره.
این روش که کانکشن رو در هرصفحه که نیاز دارین معرفی کنید خیلی جالب نیست.
اگه دوساله دیگه نیاز بود سرور بانکتون عوض بشه اونوقت باید تو تمام صفحات برید و عوض کنید.!

sahele_sheni
پنج شنبه 19 آذر 1388, 11:57 صبح
سلام . لازم نیست انقدر پیچیدش کنی .

یه sp نوشتم که کارتو راه میندازه



ALTER PROCEDURE dbo.UpdateQuery
(
@ProductID int
)
AS
SET NOCOUNT OFF;
UPDATE MyProducts
SET salecounter =
(SELECT SUM(Quantity) AS Exptr
FROM Details
WHERE (ProductID = @ProductID))
FROM MyProducts INNER JOIN
Details AS Details_1 ON MyProducts.ProductID = Details_1.ProductID

سوالی بود بپرس .
موفق باشید .

bahar_engineer
پنج شنبه 19 آذر 1388, 12:09 عصر
سلام . لازم نیست انقدر پیچیدش کنی .

یه sp نوشتم که کارتو راه میندازه



ALTER PROCEDURE dbo.UpdateQuery
(
@ProductID int
)
AS
SET NOCOUNT OFF;
UPDATE MyProducts
SET salecounter =
(SELECT SUM(Quantity) AS Exptr
FROM Details
WHERE (ProductID = @ProductID))
FROM MyProducts INNER JOIN
Details AS Details_1 ON MyProducts.ProductID = Details_1.ProductID
سوالی بود بپرس .
موفق باشید .

این کدها رو چطور استفاده کنم؟؟ بیشتر اون Procedure منظورمه

bahar_engineer
پنج شنبه 19 آذر 1388, 12:12 عصر
استاندارد بودنش رو که نمیدونم ولی اگه از LINQ استفاده کنی خیلی راحت تری.
به نظر من.
کداتون هم واضح تره.
این روش که کانکشن رو در هرصفحه که نیاز دارین معرفی کنید خیلی جالب نیست.
اگه دوساله دیگه نیاز بود سرور بانکتون عوض بشه اونوقت باید تو تمام صفحات برید و عوض کنید.!

من سایتهام رو توی vs2005 می سازم و پروژه های ویندوزی رو vs2008 ... چون این 2008 برای web application خیلی اذیت می کنه

اصلا روش هاشو نمی تونم پیدا کنم مخصوصا قسمت design

sahele_sheni
پنج شنبه 19 آذر 1388, 12:21 عصر
دوست عزیز اون که نوشتم یه Stored Procedure هست که شما توی databaseذخیره میکنی و به وسیله tableadapter مربوط به اون table اونو فراخوانی میکنی .
مگه از dataset استفاده نمی کنید ؟!

bahar_engineer
پنج شنبه 19 آذر 1388, 12:31 عصر
دوست عزیز اون که نوشتم یه Stored Procedure هست که شما توی databaseذخیره میکنی و به وسیله tableadapter مربوط به اون table اونو فراخوانی میکنی .
مگه از dataset استفاده نمی کنید ؟!

من نمی خوام نتیجه رو نمایش بدم فقط می خوام توی دیتابیس ذخیره کنم که مقدار salecounter برای هر محصول چقدر هست...

یعنی تعداد فروش هر محصول چه تعداد بوده. و در صفحات مدیریت از طریق wizard گریدویو رو ست می کنم ... و اطلاعات رو نمایش می دم

sahele_sheni
پنج شنبه 19 آذر 1388, 12:57 عصر
خب همین sp رو که فراخوانی کنید خودش واستون جمع میزنه و ذخیره میکنه ... ! فقط کافیه id کالای مورد نظر رو بهش پاس بدید .

bahar_engineer
پنج شنبه 19 آذر 1388, 13:07 عصر
چطور همه id ها رو بهش پاس بدم ؟ ببخشید آخه من تا به حال اینطوری توی دیتابیس کار نکردم

sahele_sheni
پنج شنبه 19 آذر 1388, 13:57 عصر
متاسفانه من کمتر میبینم که دوستان توی این فروم از روش dataset استفاده کنن که هم بهتره و هم سریعتره ....

من برای کار با بانکم همیشه یه dataset میزارم توی پروژه و table هام رو توی اون قرار میدم . بهد هم انواع دستوراتی رو که لازم دارم اونجا مینویسم و از توی صفحاتم فقط اونها رو فراخوانی میکنم . دیگه اینهمه دردسر Connection String نوشتن و .......... رو ندارم .


توضیحات کامل این روش رو توی کتابهای asp.net میتونی پیدا کنی .

من برای این کار شما به وسیله tableadapter مربوط به اون table ،پروسیجر رو فراخوانی میکنم و .....

raziee
پنج شنبه 19 آذر 1388, 14:08 عصر
متاسفانه من کمتر میبینم که دوستان توی این فروم از روش dataset استفاده کنن که هم بهتره و هم سریعتره ....

شایدم این طور که شما میگید نباشه.
به هر حال من ترکیبی از Dataset و LINQ رو ترجیح میدم.
LINQ to DataSet فصل چهردهم کتاب Professional LINQ نوشته ی Scott Klein.

چطور همه id ها رو بهش پاس بدم ؟ ببخشید آخه من تا به حال اینطوری توی دیتابیس کار نکردم
این تاپیک (http://barnamenevis.org/forum/showthread.php?t=94296) رو مطالعه کنید کمکتون می کنه.

bahar_engineer
پنج شنبه 19 آذر 1388, 14:40 عصر
من توی استفاده از دیتاست مشکلی ندارم ... توی محیط اکسس تا به حال کد نویسی نکردم تا بتونم اون کوئری رو به محیط اکسس اضافه کنم

توی ویژوال استدیو مشکلی ندارم