ورود

View Full Version : شرط دوتایی



HOSSEINONLINE7
پنج شنبه 05 شهریور 1394, 11:59 صبح
سلام کوئری زیر را نوشتم

Select All sum(Cast(UseValue as Float)) as TotalUseByYear,BillType,MeterName,AreaName,MeterCa pacity,year
From
( Select bp.ParameterValue as UseValue,
b.Year as year,
m.MeterName MeterName,
a.AreaName AreaName,
m.MeterCapacity MeterCapacity,
m.BillType BillType
From tbl_Bill b Join
tbl_Meter m On m.MeterID = b.FK_MeterID Join
tbl_Area a On a.AreaID = m.FK_AreaID Join
tbl_BillParameter bp On bp.FK_BillID = b.BillID Join
tbl_Parameter p On p.ParameterID = bp.FK_ParameterID
Where p.sysID = 'bt0_u_mm' And b.Year in(1394) And a.AreaID in(80042) And m.MeterID in(90089)) as x
Group by MeterName,AreaName,MeterCapacity,BillType,year

در قسمت Where من یک AreaID , MeterID را چک میکنم که برابر اینا باشن . یعنی باید AreaID اول برابر 80042 بعد براساس همین MeterID هم برابر 90089 باشه .

حالا میخوام چند تا MeterID,AreaID بزارم . و اینا با هم چک بشن .

مثلا
AreaID = 200 , MeterID=7
AreaID = 201 , MeterID = 15

به همین صورت . اول بگرده AreaID مورد نظر را پیدا کنه بعد MeterID متناظر با این .

اینا چطور باید بنویسم ؟

یک راهش اینه که بیام همین شرط را برای هر کدوم از مقادیر کامل تکرار کنم و با Union بنویسم . اینطوری هم کار میکنه ولی به نظرم جالب نیست .

HOSSEINONLINE7
جمعه 06 شهریور 1394, 10:44 صبح
دوستان لطفا راهنمایی کنید ...

SabaSabouhi
شنبه 07 شهریور 1394, 08:41 صبح
سلام کوئری زیر را نوشتم

Select All sum(Cast(UseValue as Float)) as TotalUseByYear,BillType,MeterName,AreaName,MeterCa pacity,year
From
( Select bp.ParameterValue as UseValue,
b.Year as year,
m.MeterName MeterName,
a.AreaName AreaName,
m.MeterCapacity MeterCapacity,
m.BillType BillType
From tbl_Bill b Join
tbl_Meter m On m.MeterID = b.FK_MeterID Join
tbl_Area a On a.AreaID = m.FK_AreaID Join
tbl_BillParameter bp On bp.FK_BillID = b.BillID Join
tbl_Parameter p On p.ParameterID = bp.FK_ParameterID
Where p.sysID = 'bt0_u_mm' And b.Year in(1394) And a.AreaID in(80042) And m.MeterID in(90089)) as x
Group by MeterName,AreaName,MeterCapacity,BillType,year

در قسمت Where من یک AreaID , MeterID را چک میکنم که برابر اینا باشن . یعنی باید AreaID اول برابر 80042 بعد براساس همین MeterID هم برابر 90089 باشه .

حالا میخوام چند تا MeterID,AreaID بزارم . و اینا با هم چک بشن .

مثلا
AreaID = 200 , MeterID=7
AreaID = 201 , MeterID = 15

به همین صورت . اول بگرده AreaID مورد نظر را پیدا کنه بعد MeterID متناظر با این .

اینا چطور باید بنویسم ؟

یک راهش اینه که بیام همین شرط را برای هر کدوم از مقادیر کامل تکرار کنم و با Union بنویسم . اینطوری هم کار میکنه ولی به نظرم جالب نیست .


سلام
تا همین جا به نظر من یه اشکال مهم داری و اون هم تولید یک پرسش تو در تو هست در حالی که نیازی بهش نیست.
select رو ساده بنویس، نیازی نبود که تو در تو بنویسی.
و اما در مورد پرسش شما
اگه بخوای تمام موارد رو داشته باشی همون فرمان in کار رو برات انجام می‌ده: ( AreaId in ( 200, 201 ) AND MeterId in ( 7, 15
اما اگه بخواهی که جفت جفت کنترل کنی، راه حل خوشگل نداره، باید از ترکیب And, Or استفاده کنی.


Where . . .
AND (
( AreaId = 200 AND MeterId = 7 )
OR ( AreaId = 201 AND MeterId = 15 )
)

که تو جور شرط‌ها کنترل '(' و ')' خیلی مهم هست.

صبا صبوحی