PDA

View Full Version : نمایش آماری چند کوئری در یک دی بی گرید



davoodmz
دوشنبه 06 فروردین 1386, 09:09 صبح
با سلام خدمت دوستان
من یک کوری دارم که 5 فیلد را به صورت آماری حساب می‌کند و در یک دی بی گرید نمایش می‌دهد
کد نوشته شده در یک باتون:
.

adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else null end ) .... from table1');

adoQuery1.Open;
و در یک سطر دی بی گرید نمایش داده می شود.
حال میخواهم شبیه به کد بالا منتها با شرایط خاص دیگر به باتون اضافه کنم ولی در همان گرید روی فرم در سطر دوم نمایش داده شود. و همین طور ادامه وار ...
با تشکر از همه دوستان- پیوست جهت اطلاع

ghabil
دوشنبه 06 فروردین 1386, 12:16 عصر
1)میتونی دستورات بعدی رو هم به این دستور SQLی Union بکنی.


Select .....
Union
Select.....

2)میتونی یک کلاینت دیتاست رو در حافظه بسازی و هر نتیجه ای رو توی اون اضافه کنی . و گریدت رو هم به اون اون کلاینت دیتاست وصل کنی.

اینم بگم که معمولا کمنر پیش میاد که لازم بشه آدم از این راه حلها استفاده کنه و اکثرا میشه با زدن یک کوئری درست کل نتیجه مورد نظر رو بدست آورد، مثلا در مورد کاری که تو میخوای بکنی شاید با یک Group by!

davoodmz
دوشنبه 06 فروردین 1386, 15:09 عصر
با سلام
دوست من میشه یک نمونه از کد بالا را با union اصلاح کنید لطفا
بعدش من میخام که مراحل بعدی در سطر دوم گرید نمایش داده شود و همینطور ادامه دار...

با تشکر از شما

SYNDROME
دوشنبه 06 فروردین 1386, 15:32 عصر
دوست عزیز
روشی که در بالا دوست دیگرمان گفت درست بود ولی اشکالی که دارد به ترتیب نمایش نمی دهد این با همان روش را به صورت Union All استفاده کن.
من این کار را کردم و جواب داد.

davoodmz
سه شنبه 07 فروردین 1386, 13:24 عصر
با سلام
دوست من اگه لطف کنید روشی که شما رفتید و جواب گرفتید را کدشا بزارین ممنون میشم
با تشکر
داود

mzjahromi
سه شنبه 07 فروردین 1386, 13:29 عصر
adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else
null end ) .... from table1');

adoQuery.SQL.Add('Union all');

adoQuery1.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else null end ) .... from table1 where ...');

adoQuery1.Open;

SYNDROME
سه شنبه 07 فروردین 1386, 18:59 عصر
با استفاده از روش زیر می توانید این کار را انجام دهید :
Select Test_Field From Tbl_Test
Union All
Select Test_Field From Tbl_Test
البته دو Select بالا نمایشی می باشد و فقط دستور مشخص شده بالا مهم است.

cybercoder
سه شنبه 07 فروردین 1386, 19:12 عصر
استفاده از روش زیر می توانید این کار را انجام دهید :
Select Test_Field From Tbl_Test
Union All
Select Test_Field From Tbl_Test
البته دو Select بالا نمایشی می باشد و فقط دستور مشخص شده بالا مهم است.

فقط اشکالش اینه که دیگه نمی تونی Order کنی با Sql

mzjahromi
سه شنبه 07 فروردین 1386, 19:16 عصر
فقط اشکالش اینه که دیگه نمی تونی Order کنی با Sql

مرتب کردنش مشکلی نداره

پ . ن: من نمی دونم جوابها تکراری نباشه نمیشه؟

SYNDROME
سه شنبه 07 فروردین 1386, 19:25 عصر
با سلام
دوست عزیز
1-اگر اطلاعات شما از یک Table باشد و بخواهید مرتب کنید پس چرا Union می کنید.
2-اگر اطلاعات شما از دو یا بیشتر table باشد می توانید Union ها را در یک View انجام دهید و سپس Order را بر روی View انجام دهید.
------------------------------------------------
رفتیم که رفتیم.

mzjahromi
سه شنبه 07 فروردین 1386, 19:29 عصر
کلا مرتب سازی مشکلی ندارد و اینطورها که پیچیده اش می کنید نیست

1-اگر اطلاعات شما از یک Table باشد و بخواهید مرتب کنید پس چرا Union می کنید.
صورت سوال رو یک بار دیگه بخونید


توجه
از موضوع بحث خارج نشید

SYNDROME
سه شنبه 07 فروردین 1386, 19:30 عصر
با سلام
شرمنده از اینکه دقت نکردم به پاسخ شما.:ناراحت:

با از پوزش مجدد.:خجالت:
---------------------------

با سلام
شما زمانی که اطلاعاتان در یک Table قرار دارد و می خواهید این اطلاعات را با یک نظم خواصی نمایش دهید از Union استفاده می کنید واگر بخواهید کل Query را مرتب کنید این نظم به هم می خورد.
به هر حال شاید من نتوانستم منظور خود را در کلمات بگنجانم.
با از پوزش مجدد.:خجالت:

davoodmz
چهارشنبه 08 فروردین 1386, 10:10 صبح
با سلام
باتشکر از جواب آقای ذواقدر و بقیه دوستان
مشکل حل شد اما وقتی که برای هر قسمت از کوئری‌ها که میخواهم در یک سطر گرید نمایش داده شود از دستور شرطی where استفاده میشود خطا میدهد مانند کد زیر:

adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else null end )from tabel1');
adoQuery1.SQL.Add('WHERE date_ss BETWEEN :Date1 AND :Date2'+ ' and '+ ' unit like '+QuotedStr('%'+ComboBox1.text+'%'));

adoQuery1.SQL.Add('Union all');

adoQuery1.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else null end )from table1');
در اینجا اگر از شرط ((ور)) استفاده شود خطا میدهد.

با تشکر از همه عزیزان
د راصل این کوئری یک سری آز آیتمها را میخواد با یک شرط آمار بیگره و همون آیتمها را با یک شرط دیگه و ... و نتیجه در یک گرید نمایش داده شود

mzjahromi
چهارشنبه 08 فروردین 1386, 11:41 صبح
متن خطا رو بنویسید و کد اصلی و کامل رو
خطا ربطی به Union نداره

davoodmz
چهارشنبه 08 فروردین 1386, 13:34 عصر
با سلام
متن خطا به پیوست می‌باشد
توضیح: یک where برای قسمت اول کوئری دارم که بین دو تا تاریخ را و ... می‌باشد و وقتی که where دوم را برای قسمت دوم کوئری مینویسیم که آن هم بین دو تا تاریخ و ...می‌باشد خطا رخ میدهد
کد:

adoQuery40.SQL.Clear;
adoQuery40.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else null end )from table1');
adoQuery40.SQL.Add('WHERE date_ss BETWEEN :Date1 AND :Date2'+ ' and '+ ' unit like '+QuotedStr('%'+ComboBox1.text+'%'));
adoQuery40.Parameters.ParamByName('Date1').Value:= shdatetostr(exShDatePicker1.Date);
adoQuery40.Parameters.ParamByName('Date2').Value:= shdatetostr(exShDatePicker2.Date);

adoQuery40.SQL.Add('Union all');

adoQuery40.SQL.Add('select count(no) ,count(case when(status=''cancel'') then status else null end )from table1');
adoQuery40.SQL.Add('WHERE date_ss BETWEEN :Date1 AND :Date2'+'unit like '+QuotedStr('%'+ComboBox1.text+'%')+' and '+ ' amaliat like '+QuotedStr('mec'));
adoQuery40.Open;
با تشکر

Smart User
چهارشنبه 08 فروردین 1386, 15:29 عصر
پیغام داره روی پارامتر ها اشکال می گیره.
فکر کنم اگه مقدار دهی به پارامتر هاتون رو ببرین آخر درست می شه.

ghabil
پنج شنبه 09 فروردین 1386, 03:09 صبح
adoQuery40.SQL.Add('WHERE date_ss BETWEEN :Date1 AND :Date2'+'unit like '+QuotedStr .....

Andش کو ؟ چرا فاصله نداره ؟

davoodmz
پنج شنبه 09 فروردین 1386, 11:06 صبح
با سلام
با تشکر از توجه خاص جناب آقای کوشا ، در کپی and جا افتاده بود . بازهم خطا مشهود می‌باشد
البته وقتی از ((ور)) محدوده بین تاریخ را حذف می‌کنیم درست است. آیا روشی دیگر برای اینجا می‌توان بیان کرد که محدوده تاریخ را حساب کند به اضافه شرطهای دیگر...
با روش پارامتر نمیدونم چرا خطا می‌دهد .
آخرین کد من:

adoQuery1.SQL.Clear;
adoQuery1.SQL.Add('select count(no),count(case when(status=''cancel'') then status else null end),sum(time1),sum(time2),sum(time3)'+
',count(case when(doreyi=''ÏÇÑÏ'') then doreyi else null end ),count(case when(status=''cancel'' and doreyi=''ÏÇÑÏ'') then status else null end)'+
',sum(case when(time1>0 and doreyi=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time2>0 and doreyi=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time3>0 and doreyi=''ÏÇÑÏ'' ) then time1 else null end)'+

',count(case when(pm=''ÏÇÑÏ'') then doreyi else null end ),count(case when(status=''cancel'' and pm=''ÏÇÑÏ'') then status else null end)'+
',sum(case when(time1>0 and pm=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time2>0 and pm=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time3>0 and pm=''ÏÇÑÏ'' ) then time1 else null end)from permit_all');

adoQuery1.SQL.Add('WHERE unit like '+QuotedStr('%'+ComboBox1.text+'%')+ ' and '+ ' amaliat like '+QuotedStr('mec')+
' and ' + 'date_ss BETWEEN :Date1 AND :Date2');
adoQuery1.Parameters.ParamByName('Date1').Value:= shdatetostr(exShDatePicker1.Date);
adoQuery1.Parameters.ParamByName('Date2').Value:= shdatetostr(exShDatePicker2.Date);
adoQuery1.Open;

adoQuery1.SQL.Add('union all');

adoQuery1.SQL.Add('select count(no),count(case when(status=''cancel'') then status else null end),sum(time1),sum(time2),sum(time3)'+
',count(case when(doreyi=''ÏÇÑÏ'') then doreyi else null end ),count(case when(status=''cancel'' and doreyi=''ÏÇÑÏ'') then status else null end)'+
',sum(case when(time1>0 and doreyi=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time2>0 and doreyi=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time3>0 and doreyi=''ÏÇÑÏ'' ) then time1 else null end)'+

',count(case when(pm=''ÏÇÑÏ'') then doreyi else null end ),count(case when(status=''cancel'' and pm=''ÏÇÑÏ'') then status else null end)'+
',sum(case when(time1>0 and pm=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time2>0 and pm=''ÏÇÑÏ'' ) then time1 else null end)'+
',sum(case when(time3>0 and pm=''ÏÇÑÏ'' ) then time1 else null end)from permit_all');
adoQuery1.SQL.Add('WHERE unit like '+QuotedStr('%'+ComboBox1.text+'%')+ ' and '+ ' amaliat like '+QuotedStr('mec')+
' and '+ 'date_ss BETWEEN :Date1 AND :Date2');
adoQuery1.Parameters.ParamByName('Date1').Value:= shdatetostr(exShDatePicker1.Date);
adoQuery1.Parameters.ParamByName('Date2').Value:= shdatetostr(exShDatePicker2.Date);

adoQuery1.Open;

باتشکر از همه دوستان.
داود

mzjahromi
شنبه 11 فروردین 1386, 08:24 صبح
این کوئری دوم رو که نوشتی اصلا معلوم نیست چیه
چرا دو بار کوئری Open شده؟
با اون اولی خیلی فرق داره.
در هر حال خطا ربطی به Union نداره ولی
شما کوئری قطعی رو بذار
این کوئری اگر واقعا همونی هست که اجرا می کنی ایراداتش اینه که اومدی به دید دو تا کوئری جدا بهش نگاه کردی در حالی که دو تا کوئری در قالب یک کوئری هست

davoodmz
چهارشنبه 15 فروردین 1386, 12:04 عصر
با سلام
جناب آقای ذوالقدر عزیز
حق با شماست با تشکر از شما مشکل حل شد و اشکال کار در این بود که برای قسمت اول کوئری از دو پارامتر برای بین تاریخ استفاده شده بود و از همانها برای قسمت دوم و باید نوع پارامترها عوض میشد. یعنی date1 و date2 در کوئری دوم به date3 و date4 تغییر یافت که درست شد
با تشکز از همه عزیزان