PDA

View Full Version : شرط در گروه از نوع بولین



Site Admin
جمعه 18 شهریور 1390, 09:31 صبح
با سلام و ادب
در بانک من جدول پذیرش بیماران وجود دارد که در آن یک گزارش بر اساس تاریخ گروهبندی شده بر اساس نام کلینیک و تعداد پذیرش هر کدام رو میخوام و یک فیلد دارم از نوع bit که در آن پذیرش های حذف شده است حالا من هم تعداد حذف شده رو میخوام هم حذف نشده

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



نام کلینیک و تعداد پذیرش
select nameclinic,count(*)
from tblpaziresh
where del=0 and date beetwen '1390/01/01' and '1390/10/10'
group by nameclinic

نام کلینیک و تعداد پذیرش حذف شده
select nameclinic,count(*)
from tblpaziresh
where del=1 and date beetwen '1390/01/01' and '1390/10/10'
group by nameclinic

حالا من ترکیب این دو رو میخوام بدون union یعنی در یک رکورد نام کلینیک و جلو آن تعداد پذیرش حذف نشده و تعداد پذیرش حذف شده را نمایش بده


به طور مثال

نام کلینیک تعداد پذیرش تعداد پذیرش حذف شده
داخلی 234 4
چشم پزشکی 100 6
عمومی 500 29

حمیدرضاصادقیان
شنبه 19 شهریور 1390, 08:28 صبح
سلام.
به این شکل بنویسید.

select A.nameclinic,A.count(*),b.CntDel
from tblpaziresh a
JOIN(select nameclinic,count(*) AS CntDel
from tblpaziresh
where del=1 and date beetwen '1390/01/01' and '1390/10/10'
Group by nameclinic) AS B
ON A.nameclinic=B.NameClinic

where A.del=0 and A.date beetwen '1390/01/01' and '1390/10/10'
group by A.nameclinic

Reza_Yarahmadi
شنبه 19 شهریور 1390, 20:34 عصر
سلام.
به این شکل بنویسید.

select A.nameclinic,A.count(*),b.CntDel
from tblpaziresh a
JOIN(select nameclinic,count(*) AS CntDel
from tblpaziresh
where del=1 and date beetwen '1390/01/01' and '1390/10/10'
Group by nameclinic) AS B
ON A.nameclinic=B.NameClinic

where A.del=0 and A.date beetwen '1390/01/01' and '1390/10/10'
group by A.nameclinic

(جدای از ایرادهای سینتکسی) کدتون برای حالت زیر خروجی نداره
With tbl as (
Select 'Name2' as NameClinic, 0 Del
UNION ALL
Select 'Name3' as NameClinic, 1 Del
)
میشه به صورت زیر به نتیجه مورد نظر رسید
With tbl as (
Select 'Name1' as NameClinic, 1 Del
UNION ALL
Select 'Name1' as NameClinic, 1 Del
UNION ALL
Select 'Name1' as NameClinic, 0 Del
UNION ALL
Select 'Name1' as NameClinic, 0 Del
UNION ALL
Select 'Name2' as NameClinic, 1 Del
UNION ALL
Select 'Name2' as NameClinic, 1 Del
UNION ALL
Select 'Name2' as NameClinic, 0 Del
UNION ALL
Select 'Name3' as NameClinic, 1 Del
)
Select
NameClinic,
Count(Case When Del = 1 Then 1 Else NULL END) as TrueValue,
Count(Case When Del = 0 Then 1 Else NULL END) as FalseValue
From
tbl
group by NameClinic
فقط کافیه شرط تاریخ رو به دستور اضافه کنید.

حمیدرضاصادقیان
یک شنبه 20 شهریور 1390, 08:33 صبح
(جدای از ایرادهای سینتکسی) کدتون برای حالت زیر خروجی نداره
درسته برای حالتی که گفتید جواب نمیده البته میشه تغییرش داد ولی ایراد Syntax؟؟ کدوم قسمتش؟؟

Reza_Yarahmadi
یک شنبه 20 شهریور 1390, 21:59 عصر
ولی ایراد Syntax؟؟ کدوم قسمتش؟؟
برای نامگذاری یک Select نباید از AS استفاده کرد.
Group by nameclinic) AS B

برای تابع Count نباید نام جدول قبلش بیاد
A.count(*)

فیلد b.CntDel جزء فیلدهای شرکت کننده در Group By نیست ولی به عنوان فیلد خروجی در Select معرفی شده.
کلمه between هم اشتباه شده که اون یک اشتباه تایپی است.

حمیدرضاصادقیان
دوشنبه 21 شهریور 1390, 08:00 صبح
برای نامگذاری یک Select نباید از AS استفاده کرد.

این ساختار Derived Table هست و در اینجا برای این جدول یک Alias مشخص شده که بعدا بتونید در Select از فیلدهای داخل این بلوک استفاده کنید.
در مورد Count بله اشتباه شد و باید A داخل () دستور Count قرار بگیره تا متوجه بشه جز کدوم یکی از این Select ها هست.
درمورد Group Byهم بله من دقت نکردم.

Reza_Yarahmadi
دوشنبه 21 شهریور 1390, 19:08 عصر
این ساختار Derived Table هست و در اینجا برای این جدول یک Alias مشخص شده که بعدا بتونید در Select از فیلدهای داخل این بلوک استفاده کنید.
این حرفتون کاملا صحیحه و مشکلی باهاش نیست ولی برای انتخاب Alias برای Derived Table نباید از کلمه AS استفاده کرد. در واقع مثال خودتون بصورت زیر میشه
Group by nameclinic) B

حمیدرضاصادقیان
سه شنبه 22 شهریور 1390, 07:30 صبح
اگر AS هم بذارید مشکلی ایجاد نمیکنه. ASکلمه ای اختیاری هست که میشه گذاشت یا میشه نذاشت. من برای اکثر کوئری هام قرار میدم و مشکلی هم باهاش ندارم.

Site Admin
سه شنبه 22 شهریور 1390, 23:39 عصر
با تشکر از دو دوست گرامی و جناب آقای یار احمدی بسیار بسیار از شما متشکرم