PDA

View Full Version : کمک برای ساخت یک دستور اس کیو ال برای حساب کردن یک سری مقادیر عددی .



rayson
پنج شنبه 18 مهر 1392, 19:32 عصر
سلام .
من دارم یک مقدار یک فیلد از بک جدول را از جدول دیگر کم میکنم .
من میخوام مقادیرم با سه شرط از هم متمایز باشند.
گروه ، مدرک تحصیلی و سال .
سال که در جدول اعداد وجود دارد و مشکلی نداشتم ولی گروه و مدرک تحصیلی تو دو جدول دیگر هستند و آی دی آنها در جدول اول من وجود دارد.
چطوری میتونم فراخوانی کنم + متمایز کنم + گروه و مدرک تحصیلی را هم نمایش بدهم.
کد من به صورت زیر است که سال و عدد من را بر میگردوند.
لطفا دوستان راهنمایی کنند.
با تشکر.
SqlConnection con2 = new SqlConnection(connectionString:mycon);
DataTable dt2 = new DataTable();
SqlDataAdapter da2 = new SqlDataAdapter("select add_sal,sum(B1.T1) from(select tbl_mojaz.add_sal,sum(tbl_mojaz.sonati)T1 from tbl_mojaz where convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%' group by tbl_mojaz.add_sal union all select tbl_karkard.add_sal,-sum(tbl_karkard.sonati) from tbl_karkard where convert (varchar,code_ozviat) like N'%" + txt_code_ozviat.Text + "%' group by tbl_karkard.add_sal) B1 group by add_sal", con2);
da2.Fill(dt2);
dgv_kol.DataSource = dt2;
con2.Close();

behnam-soft
جمعه 19 مهر 1392, 20:57 عصر
سلام
اگر از در جداولت از کاید خارجی استفاده کردی، چرا از InnerJoin ها استفاده نمی کنی؟

rayson
جمعه 19 مهر 1392, 23:49 عصر
سلام
اگر از در جداولت از کاید خارجی استفاده کردی، چرا از InnerJoin ها استفاده نمی کنی؟

بلد نبودم با دستور اینر جوین مقادیر موجود و غیر تکراری را بر گردنم ، چندین تا مطلب خوندم و هیچکدام هم به صورت گسترده بیان نکردن همه در حد یک مثال کوتاه و ساده.
الته این اشتباه خودم است که این آشفتگی در دیتا بیسم به وجود آمده است.
بحث سر این است که ما در این وسط 4 جدول داریم که از دو جدول باید مدرک و گروه هر شخص و دو جدول دیگر هم مجموع بر اساس سال بگیرند و از هم کم کنند که یک مقدار بدست میاد. مثل زیر.
سال :1392، مقدار کل (مثلا): 2000 ،گروه:نظارت ،مدرک : لیسانس حسابداری
سال :1392 ، مقدار کل :1500 ، گروه:نظارت ، مدرک: معماری
سال :1392 ، مقدار کل :1200 ، گروه:طراحی ، مدرک: معماری
من همانطور که در ابتدا تاپیک گفتم ، مقادیر کل را میتونم بر اساس سال متقاوت جمع ببندم اما نمیتونم بر اساس گروه + مدرک + سال جمع ببندم.( دلیل : قادر به اضافه کردن جدول جدید به کد اس کیو ال نیستم خطا میگیره از من )

Reza_Yarahmadi
شنبه 20 مهر 1392, 08:49 صبح
بصورت زیر امتحان کنید
SELECT
TM.Add_Sal,
TG.GroupName,
TD.DocumentName,
SUM(TM.Sonati - TK.Sonati) TotalValue
From
tbl_mojaz TM INNER JOIN tbl_karkard TK
ON
TM.Add_Sal = TK.Add_Sal
INNER JOIN tbl_Group TG
ON
TM.GroupID = TG.ID
INNER JOIN tbl_Document TD
ON
Tm.DocumentID = TD.ID
GROUP BY
TM._Add_Sal,
TG.GroupName,
TD.DocumentName

rayson
شنبه 20 مهر 1392, 17:01 عصر
با تشکر از شما.
بنده اومدم یک سری تغییرات ایجاد کردم و کلا سال حذف کردم و فقط گروه و مدرک تحصیلی گذاشتم . حال خطا زیر از من میگیره چک کردم چندین بار خطا از نظر لغتی ندیدم .
The correlation name 'tg' is specified multiple times in a FROM clause.
کد من بر اساس کد عضویت جستجو میشود ، کد عضویت هم در جدول مجاز وجود دارد و هم در کارکرد و من هر دو را با یک AND و به شکل زیر آوردم آیا صحیح است اینکار ؟
بابت راهنمایی متشکرم.


"select tg.group_name,td.name_madrak,sum(tm.sonati-tk.sonati) totalvalue from
tbl_mojaz tm inner join groups tg on tm.id_group=tg.id_group
inner join madrak_tahsili td on tm.id_madrak_tahsili=td.id_madrak_tahsili
,tbl_karkard tk inner join groups tg on tk.id_group=tg.id_group
inner join madrak_tahsili td on tk.id_madrak_tahsili=td.id_madrak_tahsili
where convert (varchar,tm.code_ozviat) like N'%" + txt_code_ozviat.Text + "%' and convert (varchar,tk.code_ozviat) like N'%" + txt_code_ozviat.Text + "%'
group by tg.group_name,td.name_madrak"

Reza_Yarahmadi
یک شنبه 21 مهر 1392, 07:48 صبح
شما سه جدول رو با هم Join کردید بعد دوباره با Join همون سه جدول Cross Join کردید!!(خط 13 تا 18)

select
tg.group_name,
td.name_madrak,
sum(tm.sonati-tk.sonati) totalvalue
from
tbl_mojaz tm inner join groups tg
on
tm.id_group=tg.id_group
inner join madrak_tahsili td
on
tm.id_madrak_tahsili=td.id_madrak_tahsili

, tbl_karkard tk inner join groups tg
on
tk.id_group=tg.id_group
inner join madrak_tahsili td
on
tk.id_madrak_tahsili=td.id_madrak_tahsili
where
convert (varchar,tm.code_ozviat) like N'%" + txt_code_ozviat.Text + "%'
and
convert (varchar,tk.code_ozviat) like N'%" + txt_code_ozviat.Text + "%'
group by
tg.group_name,td.name_madrak

کد من بر اساس کد عضویت جستجو میشود ، کد عضویت هم در جدول مجاز وجود دارد و هم در کارکرد و من هر دو را با یک AND و به شکل زیر آوردم آیا صحیح است اینکار ؟

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

rayson
یک شنبه 21 مهر 1392, 12:50 عصر
سلام.
با تشکر.
شما میگید وجود خط 13 تا 18 تاثیری در روند برنامه ندارد ؟
من کلا 13 تا 18 پاک کردم و فقط tbl_karkard tk فقط نوشتم.
برنامه اجرا میشود ولی مشکلی در محاسبات دارد :
برای هر کارکرد که وارد میکنم یکبار هم مجاز را خودش اضافه میکند.
مثلا:
مجاز:150
کارکرد 1 : 10
جواب : 140
کارکرد 2 : 15
جواب : 275



نیازی نیست روی هر دو جدول شرط بذارید و فقط جستجوی یک جدول کفایت میکنه (مگه اینکه در بعضی از موارد مقدار این فیلد در هر جدول مقدار متفاوتی داشته باشه که این یک مقدار غیر منطقیه)
منظور شما دقیقا متوجه نشدم.
در جدول مجاز من سالی 1 مقدار وارد میشود ولی در جدول کارکرد من ممکنه سالی 20 تا مقدار یا بیشتر وارد شود.

متشکر.

Reza_Yarahmadi
یک شنبه 21 مهر 1392, 13:01 عصر
بصورت زیر امتحان کنید
select
tg.group_name,
td.name_madrak,
sum(tm.sonati-tk.sonati) totalvalue
from
tbl_mojaz tm inner join groups tg
on
tm.id_group = tg.id_group
inner join madrak_tahsili td
on
tm.id_madrak_tahsili = td.id_madrak_tahsili

INNER JOIN tbl_karkard tk
on
tk.id_group = tg.id_group --OR tk.code_ozviat = tm.code_ozviat
where
convert (varchar,tm.code_ozviat) like N'%" + txt_code_ozviat.Text + "%'
group by
tg.group_name,td.name_madrak
در صورتی که بازم مشکلتون حل نشد ساختار جدول ها و به ازا هر جدول چند رکورد و خروجی بر اساس رکورد های موجود رو بذارید تا بهتر بشه کمکتون کرد

rayson
یک شنبه 21 مهر 1392, 13:33 عصر
خطا زیر میدهد اصلا به جواب نرسیدم :
Column 'groups.group_name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
جدول من به شکل زیر هستند (mytbl1)
کد قبلی که اجرا میشد به شکل ( mytbl2)