PDA

View Full Version : یک queryکه همه چیز داشته باشد



davoodmz
یک شنبه 12 آذر 1385, 11:05 صبح
با سلام خدمت دوستان
چگونه می توانیم یک query بسازیم که کلیه علائم محاسباتی مانند sum, count,aver و ... را باهم داشته باشد مثلاٌ جمع یک فیلد ، تعداد فیلد دیگر و با شرط خاص و ....
من برای یکی کد زیر را نوشتم ولی وقتی دو تا فیلد را میخواهیم عملیات انجام دهیم نمی آورد به کد زیر نگاهی بندازید لطفاً :



SELECT COUNT(fildename1) AS Expr1
FROM dbo.adotable1
WHERE (fildename1 = 'true')

ولی وقتی دو تا میشه مثل کد زیر جواب نمیده



SELECT COUNT(fildename1) AS Expr1, sum(fildename2) AS Expr2
FROM dbo.adotable1
WHERE (fildename1 = 'true') AND (fildename2 = 'true')

لطفاً راهنمایی فرمائید
باتشکر - داود
------------------------------
لطفا کدهای خود را در تگ کد قرار دهید
mzjahromi

محمد دادودنیا
دوشنبه 13 آذر 1385, 06:19 صبح
Count(*)
رو امتحان کن

mzjahromi
دوشنبه 13 آذر 1385, 06:54 صبح
کوئری شما یه سری مشکلات رو داره
1- fileldName2 مقدار عددی هست یا منطقی؟ اگر عددی هست پس چرا مقایسه منطقی کردی و اگر هم منطقی هست sum نباید بشه
2 - اگر منظور شما عملیات جمع برای دو کوئری به صورت جداگانه هست این دستوری که گرفتید چون شروط and شده اند هم برای count و هم برای Sum اعمال میشوند. اگر بخواهید برای count , sum دو شرط جداگانه داشته باشید باید اونا رو تو دو تا کوئری بنویسید

davoodmz
دوشنبه 13 آذر 1385, 09:00 صبح
با سلام آقای جهرمی این یک مثال بود اصل کار این است که من میخواهم روی دو تا از فیلدهام count بگیرم هر کدام با شرط مربوط به خود در یک کوری
کد مربوطه :

SELECT COUNT(fildename1) AS Expr1, count(fildename2) AS Expr2
FROM dbo.adotable1
WHERE (fildename1 = 'true') AND (fildename2 = 'true')
یعنی دو تا فیلد را بشمارد آنهایی که مقدار ارزش برابر true دارند باید طبیعتاً دو تا عدد بده مثلا فیلد یک را بده 205 تا و دومی را بده 102 تا

باتشکر
داود

mzjahromi
دوشنبه 13 آذر 1385, 09:07 صبح
یه راه اینه(البته شاید دوستان راههای ساده تری هم چیشنهاد بدن ولی


select sum(c1),sum(c2) from
(
select count(field1) as c1 , 0 as c2 from tablename
unionall
select 0 as c1 , count(field2) as c2 from tablename
)

davoodmz
دوشنبه 13 آذر 1385, 10:09 صبح
با سلام جهرمی عزیز
شرطها را کجا بنویسیم و خط دوم برنامه شما دوباره مقدار c1 را صفر میکند ، ما میخواهیم هر دو مقدار را نمایش دهیم
مثلا دو تا فیلد a1,a2 را count بگیرد هر کدام با شرط خاصی و دو مقدار c1و c2 را نمایش دهد
باتشکر
داود

mzjahromi
دوشنبه 13 آذر 1385, 11:28 صبح
select count(field1) as c1 , 0 as c2 from tablename where ...

شرطها را انتهای selectهای میانی بنویسید
select های میانی هر کدام برای یک ستون هستند درنتیجه صفر بودن همه ستونها بجز یکی از آنها طبیعی است
سعی کنید کوئری را تحلیل کنید(قبل از استفاده)

ghabil
دوشنبه 13 آذر 1385, 13:53 عصر
برای SQLServer


select Count(case when(field1=true) then field1 else null end), sum(case when(field2=true) then field2 else 0).

davoodmz
سه شنبه 14 آذر 1385, 07:16 صبح
با سلام خدمت دوستان
آقای قابیل لطفاً اگر امکان دارد همین کد را با دلفی بیان نمائید( نوشتن در دلفی) و برای زمانی که عملگر منطقی نباشد و مقایسه ای باشد
آقای جهرمی عزیز این کد شما را هم دو دلفی نوشتم ولی جواب نگرفتم میشه لطفاً کدتون را توی دلفی بیان نمایئد

کد نوشته شده من تو دلفی لطفاً کاملش کنید:



ADOQuery1.SQL.Clear;
ADOQuery1.sql.Add(' select count(filde1name1),count(fildename2) from tabelname1');
ADOQuery1.sql.Add('select count(fildename1) as c1 , 0 as c2 from tabelname1');
ADOQuery1.SQL.Add('WHERE fildename1='text here ');
ADOQuery1.sql.Add('select 0 as c1 , count(fildename2) as c2 from tabelname1');
ADOQuery1.SQL.Add('WHERE pm='text here');
ADOQuery1.Open;

با تشکر از همه شما عزیزان

mzjahromi
سه شنبه 14 آذر 1385, 07:35 صبح
یه چیزی شبیه به این


ADOQuery1.SQL.Clear;
ADOQuery1.sql.Add(' select sum(C1),sum(c2) from (');
ADOQuery1.sql.Add('select count(fildename1) as c1 , 0 as c2 from tabelname1');
ADOQuery1.SQL.Add('WHERE fildename1='text here ');
َAdoQuery1.SQL.Add('Union all');
ADOQuery1.sql.Add('select 0 as c1 , count(fildename2) as c2 from tabelname1');
ADOQuery1.SQL.Add('WHERE pm='text here');
AdoQuery1.SQL.Add(')');
ADOQuery1.Open;

سعی کنید جوابها را تحلیل کنید در غیر اینصورت با تغییر شرایط نمیتوانید استفاده ای از این کدها ببرید

ghabil
سه شنبه 14 آذر 1385, 21:50 عصر
با سلام خدمت دوستان
آقای قابیل لطفاً اگر امکان دارد همین کد را با دلفی بیان نمائید( نوشتن در دلفی) و برای زمانی که عملگر منطقی نباشد و مقایسه ای باشد


سعی کنید جوابها را تحلیل کنید در غیر اینصورت با تغییر شرایط نمیتوانید استفاده ای از این کدها ببرید

راستی کدی که نوشته بودم تو case دوم یک End کم داشت.

davoodmz
چهارشنبه 15 آذر 1385, 07:50 صبح
با سلام خدمت دوستان
با راهنمایی دوستان آقای جهرمی و کوشا کدهای زیر نوشته شد و جواب گرفته شد و جهت استفاده بقیه عزیزان :

ADOQuery1.SQL.Clear;

ADOQuery1.sql.Add('select count(NO) as c1 ,0 as c2 , 0 AS C3 ,0 as c4 ,0 as c5 from permit_all');
AdoQuery1.SQL.Add('Union all');

ADOQuery1.sql.Add('SELECT count(status) as c2 , 0 as c1 ,0 AS C3,0 as c4 , 0 as c5 from permit_all where status like'+QuotedStr('cancel'));
AdoQuery1.SQL.Add('Union all');

ADOQuery1.sql.Add('SELECT count(status) as c3 , 0 as c1 ,0 AS C2 , 0 as c4 , 0 as c5 from permit_all where status like'+QuotedStr('open'));
AdoQuery1.SQL.Add('Union all');


ADOQuery1.sql.Add('select count(doreyi) as c4 , 0 as c1 ,0 AS C2, 0 as c3 , 0 as c5 from permit_all where doreyi like '+QuotedStr('ÏÇÑÏ'));
AdoQuery1.SQL.Add('Union all');

ADOQuery1.sql.Add('SELECT count(pm) as c5 , 0 as c1 ,0 AS C2 , 0 as c3 , 0 as c4 from permit_all where PM like'+QuotedStr('ÏÇÑÏ'));

اطلاعات هر کدام در یک سطر نوشته شده و بقیه صفر میشوند که البته میتوان صفرها را نیز برداشت ولی آیا راهی وجود دارد که تمام اطلاعات در یک سطر باشد به صورت زیر باشد
2525 254 858 858 5
باز هم کمال تشکر را از دوستان دارم.

mzjahromi
چهارشنبه 15 آذر 1385, 08:00 صبح
شما یک خط از Query رو ننوشتید و الا درست میشد


ADOQuery1.sql.Add('select sum( c1) ,sum( c2) , sum( C3) ,sum( c4) ,Sum(c5) from (');

و یک


AdoQuery1.SQL.Add(') as TBL1')

در آخر کوئری.
در ضمن روشی که آقای کوشا گفتن کوئری کوتاه تری رو تولید میکنه. میتونید از اونم استفاده کنید

davoodmz
چهارشنبه 15 آذر 1385, 09:34 صبح
با سلام
با اضافه کردن خط زیر به اول کوئری :

ADOQuery1.sql.Add('select count( c1) ,count( c2) , count( C3) ,count( c4) ,count(c5) from (');
و خط زیر به آخر کوری قبل از Open


AdoQuery1.SQL.Add(') as TBL1');

کوئری جواب نمیدهد نمیدونم مشکل چیست . لطفاً راهنمایی کنید این کوئری که تا حالا خوب و عالی شده به مرحله پایانی یعنی در یک سطر نشان داده شود .
کدهای آقای کیشا ، با sql می باشد و در دلفی نوشتن خیلی آسان نیست.شاید خود آقای کوشا بتونه با دلفی بنویسد.
باتشکر

ghabil
چهارشنبه 15 آذر 1385, 13:48 عصر
Query1.SQL.Text := 'select Count(case when(field1=true) then field1 else null end), sum(case when(field2=true) then field2 else 0 end)';
Query1.Open;

mzjahromi
چهارشنبه 15 آذر 1385, 14:11 عصر
کوئری جواب نمیدهد نمیدونم مشکل چیست . لطفاً راهنمایی کنید این کوئری که تا حالا خوب و عالی شده به مرحله پایانی یعنی در یک سطر نشان داده شود .
جواب نمی دهد به چه معنی است ؟ خطا میدهد یا به جواب دلخواه نمی رسید ؟

کدهای آقای کیشا ، با sql می باشد و در دلفی نوشتن خیلی آسان نیست.شاید خود آقای کوشا بتونه با دلفی بنویسد.
برای استفاده از کدهای اس کیو ال در دلفی کارهای زیادی لازم نیست انجام دهید.

davoodmz
چهارشنبه 15 آذر 1385, 14:20 عصر
با سلام
آقای کوشا عزیز این کد را از کجا نوشتید آیا تست کردید - جواب میده
مثلاً برای دو فیلد A1و A2 از نوع STRING کدش را بنوسید . با شرط A1=دارد , A2=دارد
یعنی داردهای این دو تا فیلد را بشمارد. کدی که شما نوشتید خیلی کامل نیست.
آقای جهرمی عزیز : خطا میدهد و اجرا نمیشود. راستی اگر این کوئری به مرحله پایان برسد واقعاً از شما باید کمال تشکر را کرد چونی کوئری آماری خوبی از آب درمیاد
کوئری به صورت زیر جواب میدهد عکس پیوست
با تشکر فراوان از شما
داود

mzjahromi
پنج شنبه 16 آذر 1385, 07:01 صبح
صورت جواب رو میدونم.
شرح خطائی رو که میده بنویسید+ آخرین کوئری که نوشتید.
این شکلی نمیشه کمکی کرد
آخرین کوئری که نوشتید رو از توی دلفی Copy Paste کنید اینجا

davoodmz
پنج شنبه 16 آذر 1385, 08:23 صبح
با سلام
من دو خط کدی که اضافه نمود به برنامه یعنی این دو خط :

ADOQuery1.sql.Add('select count(c1) ,count( c2) , count( C3) ,count( c4) ,count(c5) from (');
AdoQuery1.SQL.Add(') as TBL1');

برای همه ستونها یک عدد ثابت میدهد که هیچ ربطی به عملیات ما ندارد یعنی برای همه عدد 5 را نمایش میدهد
و بدون اضافه کردن این دو کد جواب میدهد و هیچ مشکلی ندارد ولی فقط در یک سطر نیستند مانند ضمیمه تایپیک قبلی
کل برنامه نوشته شده برای این کوئری:

ADOQuery1.SQL.Clear;

ADOQuery1.sql.Add('select count(c1) ,count( c2) , count( C3) ,count( c4) ,count(c5) from (');

ADOQuery1.sql.Add('select count(NO) as c1 ,0 as c2 , 0 AS C3 ,0 as c4 ,0 as c5 from permit_all');
AdoQuery1.SQL.Add('Union all');

ADOQuery1.sql.Add('SELECT count(status) as c2 , 0 as c1 ,0 AS C3,0 as c4 , 0 as c5 from permit_all where status like'+QuotedStr('cancel'));
AdoQuery1.SQL.Add('Union all');

ADOQuery1.sql.Add('SELECT count(status) as c3 , 0 as c1 ,0 AS C2 , 0 as c4 , 0 as c5 from permit_all where status like'+QuotedStr('open'));
AdoQuery1.SQL.Add('Union all');


ADOQuery1.sql.Add('select count(doreyi) as c4 , 0 as c1 ,0 AS C2, 0 as c3 , 0 as c5 from permit_all where doreyi like '+QuotedStr('ÏÇÑÏ'));
AdoQuery1.SQL.Add('Union all');

ADOQuery1.sql.Add('SELECT count(pm) as c5 , 0 as c1 ,0 AS C2 , 0 as c3 , 0 as c4 from permit_all where PM like'+QuotedStr('ÏÇÑÏ'));

AdoQuery1.SQL.Add(') as TBL1');

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

ghabil
جمعه 17 آذر 1385, 11:46 صبح
من باورم نمیشه خودت نمیتونی اینارو عوض کنی !!



Query1.SQL.Text := 'select Count(case when(A1=''دارد'') then A1 else null end), sum(case when(A2=''دارد'') then A3 else 0 end) from اسم جدولت ';
Query1.Open;

برای این نوشتم A3 که Sum فیلد String که مقدارش "دارد - ندارد " هست رو که نمیشه گرفت....

mzjahromi
جمعه 17 آذر 1385, 16:53 عصر
بدون خط دوم و آخر جواب درست است در یک سطر نیست با این دو خط جواب همه 5 میباشد ولی در یک سطر
دوست عزیز در خط اول بجای count از sum استفاده کنید.
همونطور که قبلا هم گفتم سعی کنید منطق کار رو درک کنید

davoodmz
شنبه 18 آذر 1385, 09:18 صبح
با سلام خدمت دوستان
آقای کوشا با تشکر از شما مشکل حل شد ، من شرط دیگر هم داشتم که بعد از دستور شما با where نوشتم و کاملا درست شد و جواب گرفتم. بازهم تشکر صمیمانه از شما

آقای جهرمی عزیز با تشکر از شما ، مشکل حل شد با کدهای شما دستورات شرطی بیشتری میشه داد بین کدها ، ولی با sum هم من امتحان کردم نتیجه 5 فیلد را در یک فیلد جمع میکند و نمایش میدهد. به این صورت 0 0 0 0 7282 که عدد 7282 مجموع فیلدها می باشد. با این حال مشکل ما حل شد با کمک شما و آقای کوشا . ولی اگر کد شما هم اصلاح شود خیلی عالی میشود.
بازهم صمیمانه از شما دو بزرگوار تشکر مینمایم
داود

mzjahromi
شنبه 18 آذر 1385, 09:55 صبح
کدتون رو اینجوری بنویسید


ADOQuery1.SQL.Clear;
ADOQuery1.sql.Add('select sum(c1) ,sum( c2) , sum( C3) ,sum( c4) ,sum(c5) from (');
ADOQuery1.sql.Add('select count(NO) as c1 ,0 as c2 , 0 AS C3 ,0 as c4 ,0 as c5 from permit_all');
AdoQuery1.SQL.Add('Union all');
ADOQuery1.sql.Add('SELECT 0 as c1,count(status) as c2 , ,0 AS C3,0 as c4 , 0 as c5 from permit_all where status like'+QuotedStr('cancel'));
AdoQuery1.SQL.Add('Union all');
ADOQuery1.sql.Add('SELECT 0 as c1 ,0 AS C2 ,count(status) as c3 , 0 as c4 , 0 as c5 from permit_all where status like'+QuotedStr('open'));
AdoQuery1.SQL.Add('Union all');
ADOQuery1.sql.Add('select 0 as c1 ,0 AS C2, 0 as c3 ,count(doreyi) as c4 , 0 as c5 from permit_all where doreyi like '+QuotedStr('ÏÇÑÏ'));
AdoQuery1.SQL.Add('Union all');
ADOQuery1.sql.Add('SELECT 0 as c1 ,0 AS C2 , 0 as c3 , 0 as c4,count(pm) as c5 from permit_all where PM like'+QuotedStr('ÏÇÑÏ'));
AdoQuery1.SQL.Add(') as TBL1');

مشکل شما این بود که همه رو تو ستون اول قرار داده بودید و بعد از Union کردن همگی بنام c1 ارائه میشدند و در نتیجه تنها جمع ستون اول ارائه میشد.

davoodmz
یک شنبه 19 آذر 1385, 08:56 صبح
با سلام آقای جهرمی
البته مشکل من رفع شده است ولی دوست دارم این کد هم به مرحله پایانی برسد لذا تایپیک مجدد خدمت شما زدم
من منظورم این نیست که اولی را فقط نشان میدهد . همین کد نوشته شده شما که من هم استفاده کردم به این صورت کار میکند که مثلا باید 5 عدد در 5 ستون بدهد مثل
2 5 8 0 1
را ولی مجموع این اعداد در ستون اول نمایش داده میشود و بقیه صفر یعنی به این صورت
0 0 0 0 16
با تشکر از شما
داود

mzjahromi
دوشنبه 20 آذر 1385, 07:03 صبح
کد را دقیقابه شکلی که من در پست 23 نوشتم بنویسید جواب به هماان صورت دلخواه شما خواهد بود

davoodmz
سه شنبه 21 آذر 1385, 10:31 صبح
اقای جهرمی با سلام
من هم دقیقا همون کد شما را نوشتم . ولی نشد- دیگه نمیخواهم در این تایپیک مزاحمتون بشم
ختم تایپیک را اعلام فرمائید. باتشکر از شما و دوستان عزیز
داود