PDA

View Full Version : سوال: مشکل با count در ایجاد کوئری



momimomi
پنج شنبه 10 دی 1394, 07:26 صبح
سلام دوستان برنامه نویس
جدول زیر را ببینید

138051

کوئری نیاز دارم که خروجی زیر زا برای هر تاریخ بدهد

138052

با دستور distinct تاریخ های تکراری را در خروجی فیلتر می کنم اما از دستور count نمی توانم همزمان با select distict استفاده کنم
راه حل شما چیست؟
کوئری به اکسس ارسال می شود.
با تشکر

محمد رضا فاتحی
پنج شنبه 10 دی 1394, 08:17 صبح
شما باید نتیجه کوئری رو با group by دسته بندی کنید

momimomi
پنج شنبه 10 دی 1394, 08:44 صبح
شما باید نتیجه کوئری رو با group by دسته بندی کنید

ممنون از پاسخ سریع جنابعالی
کوئری زیر را ببینید:

138053

نتیجه زیر را می دهد:

138054

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

Mahmoud Zaad
پنج شنبه 10 دی 1394, 10:08 صبح
سلام
اولاً چون جدول شما رکوردها رو زیر هم ذخیره میکنه ولی شما می خواید گزارش رو افقی نشون بدید که دقیقاً همین رو نمی تونید بگیرید مگر با pivot کردن. اما با گروه بندی همون اطلاعات رو می تونید بگیرید و در برنامه به صورت افقی نمایش بدید.
اما، شما در کوئری وضعیت رو سلکت کردید ولی بر اساس فیلد تاریخ گروه بندی کردید باید بر اساس وضعیت گروه بندی کنید و در شرط Where تاریخ رو بنویسید یعنی

select vaziat, count(vaziat) from class_personel where taclass=1111 group by vaziat

فقط تعداد کل می مونه که میشه در خود برنامه بعد از اینکه کوئری بالا رو اجرا کردید محاسبه اش کنید یا اینکه یه ستون جدید در کوئری ایجاد کنید و کل رکوردها رو هم بشمارید:

select vaziat, count(vaziat), (select count(*) from class_personel where taclass=1111) AS kol from class_personel where taclass=1111 group by vaziat

فقط در این حالت دوم شرطی رو که برای کوئری اصلی می نویسید دقیقاً باید برای کوئری که مربوط به شمارش کل هست هم بنویسید.

Mahmoud.Afrad
پنج شنبه 10 دی 1394, 11:55 صبح
select COUNT(CASE class_personel.vaziat WHEN N'مجاز' THEN 1 END) as TedadMojaz ,
COUNT(CASE class_personel.vaziat WHEN N'غایب' THEN 1 END) as TedadGayeb ,
COUNT(CASE class_personel.vaziat WHEN N'حاضر' THEN 1 END) as TedadHazer ,
COUNT(class_personel.vaziat) as TedadKol ,
class_personel.taclass
from class_personel
group by class_personel.taclass

zayens
پنج شنبه 10 دی 1394, 12:01 عصر
هیچ کدوم از کدهایی که دوستان گفتن جواب استارتر نیست چون توی یک سطر جواب بدست نمیاد
این کد دقیقا توی یک سطر همونطور که خواستی توی سوالت جواب میده:
select taclass as 'تاریخ کلاس',
(select count(*) from class_personel where taclass='1394/09/27') AS'تعداد کل',
(select count(*) from class_personel where taclass='1394/09/27' and vaziat=N'حاضر') AS 'تعداد حاضرین'
,(select count(*) from class_personel where taclass='1394/09/27' and vaziat=N'غایب') AS 'تعداد غایبین'
,(select count(*) from class_personel where taclass='1394/09/27' and vaziat=N'مجاز') AS 'تعداد مجاز'
from class_personel
where taclass='1394/09/27'
group by taclass

تست شده


ویرایش:
پست آقای Mahmoud.Afrad (http://barnamenevis.org/member.php?71297-Mahmoud-Afrad)
با پست من همزمان بود و درست هست
اگر زودتر دیده بودم پست ایشون را جواب نمیدادم

Mahmoud Zaad
پنج شنبه 10 دی 1394, 13:06 عصر
درسته چون تعداد گروه ها رو می دونیم روش دوستان صحیح تره البته به نظرم جواب آقای Mahmoud.Afrad نسبت به روش آقای zayens در تعداد رکوردهای بالا بهینه تر هست.

در اکسس دستور switch به شکل زیر جواب میده:

switch (class_personel.vaziat = 'mojaz' , 0)

"mojaz" همون "مجاز" شما هست!

momimomi
پنج شنبه 10 دی 1394, 18:43 عصر
ممنون از همه دوستان و مهندسین گل که بنده را یاری کردند
کوئری زیر را نوشتم:


OleDbCommand cmd = new OleDbCommand("TRANSFORM Count(class_personel.[code]) AS CountOfcode" +
" SELECT class_personel.[taclass] as [تاریخ کلاس], Count(class_personel.[code]) AS [تعداد کل]" +
" FROM class_personel GROUP BY class_personel.[taclass] PIVOT class_personel.[vaziat]", con);[/LTR_INLINE]



خروجی به این شکل شد:

138077

بازم ممنون از همه

zayens
شنبه 12 دی 1394, 11:00 صبح
توی مباحث SQL اصولی ترین راه برای اینجور کوئری زدن (استفاده از دیتا بعنوان ستونها) Pivot هست
در واقع شما کلمات مجاز و غایب و حاضر که توی دیتا هست را میخواین بعنوان ستون نمایش بده و دیتای زیرش رو جمع بزنه
این روش دیگه کوئری طولانی مثل سلکت های قبلی را نداره و کافیه از کوئری زیر استفاده کنید
select *from
(
select code, taclass, vaziat
from class_personel
where taclass='1394/09/27'
) src
pivot
(
count(code)
for vaziat in ([مجازها], [غایبین], [حاضرین])
) piv;

فک نمیکنم ازین کد بهینه تر هم برای دوستمون وجود داشته باشه