PDA

View Full Version : مشکل در استفاده ازدستور select !



akram
پنج شنبه 18 بهمن 1386, 06:38 صبح
سلام ,خسته نباشید
سوال من اینه که ایا میتونم دستور select ای داشته باشم که در عین اینکه جند تا فیلد را برای نمایش انتخاب میکنه ,روی بعضی از اونها sum بگیره و نیاز به گروهبندی روی سایر فیلدها نداشته باشه,با این مثال مشکلم را بهتر توضیح میدم مثلا:
select a,b,c,sum(d) as s_d,sum(e)as S_e from table1 groupby d,e
وقتی دستور بالا را مینویسم مجبورم گروهبندی را روی a,b, c هم انجام بدم که نتیجه sum ها را تغییر میده اگر هم بخوام جواب sum درست باشه مجبورم که فیلدهای a,b,c را به کل از Select حذف کنم در حالیکه من نیاز به نمایش مقدار اونها همراه با مجموع دوفیلد d,e دازم !
اگه ممکنه راهنماییم کنید کجای کارم اشکال داره

akram
پنج شنبه 18 بهمن 1386, 06:48 صبح
سلام مجدد ببخشید من یک اصلاحی انجام بدم
در مثالم چون نیاز به مچموع گروهی از سطرها دارم باید بر اساس ان فیلد گرهبندی کنم نه الزاما d,e مثلا بر اساس فقط a ,ولی وقتی groupby را مینویسم sqlserver ازم میخواد که سایر فیلدهای به کار رفته در select را هم در groupby ذکر کنم
متشکرم

SYNDROME
پنج شنبه 18 بهمن 1386, 07:41 صبح
دوست عزیز شما برای استفاده از دستور Sum باید بر مثلا 2 فیلد گروه بندی کنید و سپس مجموع فید d را که مربوط به ستونهای گروه بندی شده باشد را به دست آورید.
مثلا
Name*****Family******Salary
Ali******Ahmadi******1000
Ali******Ahmadi******2000
Mohammad***Ahmadi****5000
و با دستور


Select Name , Family , Sum(Salary) As SumSalary
From Tbl_Test
Group By Name , Family

و نتیجه خواهد شد.
Ali******Ahmadi******3000
Mohammad***Ahmadi****5000
موفق باشید

Amir_Safideh
پنج شنبه 18 بهمن 1386, 10:47 صبح
خوب من دقیقا نمیفهمم چرا شما اصرار دارید که گروهبندی به این شکل انجام نشه . چون این پروسیجر شما رکوردهای زیادی با مقادیر مشابه خواهد داشت .
این روش رو امتحان کنید شاید جواب بگیرید :


Select A,B,C,(Select Sum(D)From Table1 TInner)As S_D,(Select Sum(E)From Table1 TInner)As S_E
From Table1 TOuter
در ضمن شما میتونید برای فیلدهای مجموع شرط هم در نظر بگیرید یعنی این که مجموع این فیلد براساس یک شرط خاص .
باز هم اگر من درست متوجه نشدم یا این کد جواب نداد مشکل رو بفرمائید تا کد را اصلاح کنم .

AminSobati
پنج شنبه 18 بهمن 1386, 11:56 صبح
سلام ,خسته نباشید
سوال من اینه که ایا میتونم دستور select ای داشته باشم که در عین اینکه جند تا فیلد را برای نمایش انتخاب میکنه ,روی بعضی از اونها sum بگیره و نیاز به گروهبندی روی سایر فیلدها نداشته باشه,با این مثال مشکلم را بهتر توضیح میدم مثلا:
select a,b,c,sum(d) as s_d,sum(e)as S_e from table1 groupby d,e
وقتی دستور بالا را مینویسم مجبورم گروهبندی را روی a,b, c هم انجام بدم که نتیجه sum ها را تغییر میده اگر هم بخوام جواب sum درست باشه مجبورم که فیلدهای a,b,c را به کل از Select حذف کنم در حالیکه من نیاز به نمایش مقدار اونها همراه با مجموع دوفیلد d,e دازم !
اگه ممکنه راهنماییم کنید کجای کارم اشکال داره

سلام،
زمانیکه شما از توابع Aggregation (مثل sum, min, max...) استفاده میکنید، تمام فیلدهایی که تحت Aggregation قرار ندارند، باید الزاما در Group By شرکت کنند. در غیر اینصورت منطق Query با مشکل مواجه میشه. به نظر میرسه استفاده از دو Query که با هم union میشن کار شما رو جواب بده، ولی این بستگی به شکل نهایی گزارش داره که انتظارش هست

akram
جمعه 19 بهمن 1386, 06:29 صبح
خیلی ممنون از لطف دوستانی که به سوال بنده توجه داشتید و پاسخ دادید
دقیقا مشکل من همون هست که آقای Amir_safideh فرمودند یعنی نتیجه رکوردهای تکراری زیادی خواهد داشت اگر گروهبندی را روی همه فیلدها انجام بدم

akram
جمعه 19 بهمن 1386, 06:41 صبح
حناب Amir_safideh توضیح شما باید کار من را راه بندازه فقط آیا میتونم برای sum ها گروهی هم در نظر بگیرم؟یعنی دستور شما به این صورت تغییر کنه
Select A,B,C,(Select Sum(D)From Table1 TInner Groupby C)As S_D,(Select Sum(E)From Table1 TInner Group by C)As S_E
From Table1 TOuter
و ضمن تشکر از جناب AminSobati همونطور که گفتید "تمام فیلدهایی که تحت Aggregation قرار ندارند، باید الزاما در Group By شرکت کنند " میتونم خواهش کنم توضیح بدین که چه طوری میشه از دو Query که با هم union میشن ,استفاده کرد ایا منظورتون به شکلی است که آقای
Amir_safideh گفته اند؟
متشکرم

Amir_Safideh
جمعه 19 بهمن 1386, 12:16 عصر
نه خیر دوست عزیز تا اونجا که من میدونم نمیشه این نوع گروهبندی رو در داخل اون فیلد Sum انجام داد . ولی اگر شما مثلا میخواهید گروهبندی رو در فیلد مجموع بر روی مثلا فیلد C داشته باشی میتونی در این فیلد مجموع یه شرط برای دستور Select در نظر بگیری به این شکل :


Select A,B,C,(Select Sum(D)From Table1 TInner Where TInner.C = TOuter.C)S_D,
(Select Sum(E)From Table1 TInner Where TInner.C = TOuter.C)S_E
From Table1 TOuter

این کد حاصل جمع فیلد D و E براساس فیلد C برمیگردونه .
بازهم خدمتتون عرض میکنم به نظر میرسه یه جای کار مشکل داره . به نظر منطقی نمیرسه که اطلاعات رو به این شکل گروهبندی کنیم ولی به هر حال امیدوارم که این کد کارتون رو راه بندازه اگر مشکلی بود بفرمائید تا اگر بتونیم مشکل رو حل کنیم .

----------------
موفق باشید

akram
دوشنبه 22 بهمن 1386, 07:01 صبح
ضمن تشکر جناب Amir_Safideh
ببینید من در واقع این راه حل را برای سند های حسابداری میخوام که باید برای اعداد درج شده در سند بر اساس اینکه بدهکار یا بستانکار هسند و همچنین براساس کد کل مربوطه مجموع را بدست بیارم(یعنی گروهبندی اول بر اساس فیلد بولین بدهکار /بستانکارو دوم بر اساس کد کل )
ولی در عین حال باید فیلدهای دیگری مثل کد های معین و تفضیلی ,شرح سند ,تاریخ و شماره سند و ... را هم انتخاب کنم چون در گزارش سند وجودشون الزامیه.
خوب مشکل من اینه که با انتخاب این فیلدها مجموع بدست امده خراب میشه یعنی چون مجبورم همه فیلدها را در گروهبندی ذکر کنم ( چون تمام فیلدهایی که تحت Aggregation قرار ندارند، باید الزاما در Group By شرکت کنند)طبیعتا محدوده گروهبندی انقدر کوچک میشه که به
یک رکورد میرسه و اصلا مجموعی نخواهیم داشت
البته راه حل دوم شما را هنوز امتحان نکردم گفتم تا به اینترنت دسترسی دارم مشکلم را براتون روشنتر کرده باشم
بازم تشکر میکنم

Amir_Safideh
دوشنبه 22 بهمن 1386, 15:49 عصر
ببینید من در واقع این راه حل را برای سند های حسابداری میخوام که باید برای اعداد درج شده در سند بر اساس اینکه بدهکار یا بستانکار هسند و همچنین براساس کد کل مربوطه مجموع را بدست بیارم(یعنی گروهبندی اول بر اساس فیلد بولین بدهکار /بستانکارو دوم بر اساس کد کل )



ولی در عین حال باید فیلدهای دیگری مثل کد های معین و تفضیلی ,شرح سند ,تاریخ و شماره سند و ... را هم انتخاب کنم چون در گزارش سند وجودشون الزامیه.


نقل قول اول شما این معنی رو میده که شما میخواهید مجموع بدهکار یا بستانکار یک حساب که حالا میتونه حساب معین یا تفصیلی یا هر کدوم دیگه باشه رو بدست بیارید .
و نقل قول دوم شما این معنی رو میده که شما میخواهید جزئیات تمام اسناد نمایش داده بشه حتی شرح سند و حتی شماره سند که قائدتا یک آی ذی یکتاست یعنی یک آی دی که در سندهای شما فقط خودشه و مشابه نداره . خوب این دوتا نقل قول از شما هر کدوم نقل قول دیگه رو یه جورائی مشکل دار میکنه .
ببینید دوست عزیز اون کدی که من براتون فرستادم این مشکل رو براتون حل میکنه ولی همونطور که تو پستهای قبلی هم براتون گفتم شما با این کوئری تعداد زیادی رکورد خواهید داشت که مقدار مجموع بدهکار و بستانکار مشابه (بر اساس گروهبندی خودتون)خواهند داشت و فقط شرح سند و شماره سند در اونها متفاوت خواهد بود و این گزارش گزارش جالبی از آب در نمیاد .
یعنی اگر شما فیلد مجموع رو براساس حساب کل گروهبندی کنید و اگر این حساب کل شما دارای 20 حساب تفصیلی باشه و هر حساب تفصیلی دارای 100 سند باشه در اونصورت کوئری شما در 2000 مورد فیلد مجموع بدهکار و بستانکار رو با مقادیر مشابه برمیگردونه و فقط شرح سند و شماره سند متفاوت خواهد بود .
به نظر میاد بهتر باشه اگر شما قصد دارید که شرح سند و شماره سند هم نمایش داده بشه دراینصورت از فیلد مجموع صرفنظر کنید یعنی اینکه مقادیر هر رکورد رو عینا نمایش بدید بدون جمع کردن و بدون گروهبندی و اگر هم میخواهید مقادیر رو بر اساس حساب کل و در عین حال براساس بدهکار و بستانکار جمع کنید در اینصورت از شماره سند و شرح سند و تاریخ سند صرفنظر کنید یا بهتره که دوتا گزارش جدا طراحی کنید .

------------
موفق باشید.

akram
چهارشنبه 24 بهمن 1386, 16:40 عصر
با سلام خدمتتون عرض شود که
[QUOTE=Amir_Safideh;465554]نقل قول اول شما این معنی رو میده که شما میخواهید مجموع بدهکار یا بستانکار یک حساب که حالا میتونه حساب معین یا تفصیلی یا هر کدوم دیگه باشه رو بدست بیارید .
]
نه من فقط میخوام که بر اساس کد های کل مجموع بدست بیاره نه کدهای دیگر
و اینکه نمیشه که توی سند بقیه فیلدها را نیارم , همونظور که گفتم الزامیه که انتخابم روی بقیه فیلدها هم باشه
من فکر کردم شاید راهی باشه که بشه یک SELECT روی سایر فیلدها داشته باشم و یک SELECT هم برای بدست اوردن مجموع ها,بعد از هر دوشون کنار هم توی گزارشم که همون سند حسابدارییه وبا استفاده از کریستال ریپورت ساختمش , استفاده کنم
ولی نمیدونم چه طوری؟