ورود

View Full Version : به چه صورت از دستور Sum برای چند ستون استفاده کنیم ؟



rayson
یک شنبه 12 آبان 1392, 15:16 عصر
سلام .
دوستا ن من دو جدول دارم که میخوام ستون های مشابه را سام کنم.
برای ستون اول مشکلی ندارد که کد زیر است :
SqlDataAdapter da2 = new SqlDataAdapter("select sum(B1.T1)from(select sum(tbl_mojaz.sonati)T1 from tbl_mojaz where convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%' group by tbl_mojaz.id_madrak_tahsili,tbl_mojaz.id_group union all select -sum(tbl_karkard.sonati) from tbl_karkard where convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%' group by tbl_karkard.id_madrak_tahsili,tbl_karkard.id_group )B1 ", con2);

اما برای زمانی که بخواهم ستون دوم اضافه کنم برنامه دچار خطا میشود ، در کل نمیدونم چطور ستون دوم اضافه کنم.
ممنون میشم راهنمایی کنید.
با تشکر.

Salah Sanjabian
یک شنبه 12 آبان 1392, 18:03 عصر
سلام داده های نمونه رو بذارید تا دوستان بهتر بتونن راهنمایی کنن

rayson
یک شنبه 12 آبان 1392, 18:18 عصر
سلام داده های نمونه رو بذارید تا دوستان بهتر بتونن راهنمایی کنن
سلام به شکل زیر هستند جداولم و کارش هم مثال زدم .
من ستون اول را طبق کد بالا(ستون سنتی ) مانده را در آوردم اما برای دو ستون دیگر نمیشه.

Salah Sanjabian
یک شنبه 12 آبان 1392, 19:31 عصر
سلام

;
WITH Cte AS
(
SELECT Code_ozviat,SUM(SakhteShode) AS TotalSakhteShode,SUM(Felezi) AS TotalFelezi,SUM(Sonati) AS TotalSonati
FROM @Tbl_mojaz
GROUP BY Code_ozviat
)
,
Cte2 AS
(
SELECT Code_ozviat,SUM(SakhteShode) AS TotalSakhteShode,SUM(Felezi) AS TotalFelezi,SUM(Sonati) AS TotalSOnati
FROM @Tbl_Karkard
GROUP BY Code_ozviat
)

SELECT Cte.Code_ozviat,ISNULL(Cte.TotalSakhteShode-Cte2.TotalSakhteShode,0),ISNULL(Cte.TotalFelezi-Cte2.TotalFelezi,0),ISNULL(Cte.TotalSonati-Cte2.TotalSOnati,0)
FROM Cte
LEFT JOIN Cte2
ON Cte.Code_ozviat = Cte2.Code_ozviat
WHERE cte.Code_ozviat=1


میتونی تو اس کو ال سرور تست کنی بعد تو ویژوال استودیو . البته پیشنهاد نمیکنم به صورت رشته تو پروژه ت بنویسی بهتره به صورت پروسیجر بنویسی بعد پروسیجر رو Call کنی
یه چیز دیگه که توجه کردم این بود که نمیخواد رو جدول اول Sum بزنی چون ستون ID کلید هست و فقط یک بار تکرار میشه البته من واسه اطمینان چون شما Sum زدین اینکارو کردم . درسته ؟

حمیدرضاصادقیان
یک شنبه 12 آبان 1392, 20:01 عصر
سلام.
میتونید از روش زیر هم که همون تکمیل شده روش خود شماست استفاده کنید.

Select Sum (B1.T1) as Sonati , Sum(b1.t2) as TotalFelezi, sum(b1.t3 ) as totalsakhteshode
From
(select sonati as T1 ,Felezi as T2,SakhteShode as T3
from tbl_mojaz where convert (varchar,code_ozviat)
like N'%" + txt_code_ozviat.Text + "%'
group by tbl_mojaz.id_madrak_tahsili,tbl_mojaz.id_group
union all
select -sonati as T1 ,-Felezi as T2,-SakhteShode as T3
from tbl_karkard
where convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%'
group by tbl_karkard.id_madrak_tahsili,tbl_karkard.id_group ) as B1


فقط میتونید از لحاظ Performance هر دو Query رو باهم اجرا کنید و Execution Plan رو نیز انتخاب کنید و ببینید Plan کدوم مناسبتره و هزینه کدوم یک از این Query ها کمتره.

rayson
یک شنبه 12 آبان 1392, 20:53 عصر
سلام مرسی از دوستان.
طبق گفته های آقای صادقیان تغییر و به نتیجه رسیدم .

یه چیز دیگه که توجه کردم این بود که نمیخواد رو جدول اول Sum بزنی چون ستون ID کلید هست و فقط یک بار تکرار میشه البته من واسه اطمینان چون شما Sum زدین اینکارو کردم . درسته ؟
جدول مجاز هم مقادیر دیگری برای یک کد عضویت وارد میشه به همین دلیل مجموع آن هم خواستم.

دوستان اگر توجه کردید در کد من :
Group by id_madrak_tahsili , id_group
در هر دو جدول داشتم. که مقادیر طبق این دو متمایز میکردم.
من دو جدول دیگر به نام های گروه و مدرک تحصیلی دارم حال میخوام علاوه بر این سه مقدار(سنتی ، فلزی ، ساخته شده ) نمایش داده شده گروه و مدرک تحصیلی هم نمایش بدم ، کدش بلدم که باید نام گروه و نام مدرک سلکت کنم و با ای دی مقایسه کنم و مقادیر مشابه را نمایش بدم . این کد زمانی میتونستم بنویسم خودم به راحتی که کد بالا نبود ولی الان کد بالا که نوشتم نمیدونم این 2 ستون دیگر را چطوری بنویسم که برنامه خطا نگیره.
یک نمونه کد میزارم که باعث میشه شکل زیر به وجود بیاد:
SqlDataAdapter da1 = new SqlDataAdapter("select tbl_karkard.add_sal,sum(tbl_karkard.sonati),sum(tb l_karkard.felezi),sum(tbl_karkard.sakhteshode),gro ups.group_name,madrak_tahsili.name_madrak from tbl_karkard,groups,madrak_tahsili where groups.id_group=tbl_karkard.id_group and madrak_tahsili.id_madrak_tahsili=tbl_karkard.id_ma drak_tahsili and convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%' group by tbl_karkard.add_sal,tbl_karkard.id_group,tbl_karka rd.id_madrak_tahsili,groups.group_name,madrak_tahs ili.name_madrak", con1);

دو تا ضربدر ابی از کد بالا پیروی میکنند حال جدول پایین ( جدول 3 ) هم چیزی که کدش در پست قبلی گذاشتم . حال چطور میتونم مثل دو جدول دیگر گروه و مدرک شخص را هم اضافه کنم.
با تشکر.

Salah Sanjabian
یک شنبه 12 آبان 1392, 21:07 عصر
سلام.
میتونید از روش زیر هم که همون تکمیل شده روش خود شماست استفاده کنید.

Select Sum (B1.T1) as Sonati , Sum(b1.t2) as TotalFelezi, sum(b1.t3 ) as totalsakhteshode
From
(select sonati as T1 ,Felezi as T2,SakhteShode as T3
from tbl_mojaz where convert (varchar,code_ozviat)
like N'%" + txt_code_ozviat.Text + "%'
group by tbl_mojaz.id_madrak_tahsili,tbl_mojaz.id_group
union all
select -sonati as T1 ,-Felezi as T2,-SakhteShode as T3
from tbl_karkard
where convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%'
group by tbl_karkard.id_madrak_tahsili,tbl_karkard.id_group ) as B1


فقط میتونید از لحاظ Performance هر دو Query رو باهم اجرا کنید و Execution Plan رو نیز انتخاب کنید و ببینید Plan کدوم مناسبتره و هزینه کدوم یک از این Query ها کمتره.
اینم یه روش ولی یه نکته جناب صادقیان و اونم اینکه تو Derived تیبل دیگه نمیخواد گروه بندی کنید چون شما از توابع تجمعی استفاده نکردین

حمیدرضاصادقیان
دوشنبه 13 آبان 1392, 04:47 صبح
اوههه درسته/چون من کد ایشون رو کپی کردم دیگه به این نکته توجه نکردم.