2016-07-01 2 views
0

where 절의 제약 조건에 관해 다른 질문이 있습니다. 여기 내 코드입니다 :SQL 설정 제약 Where 절에서 무엇을해야할지 모르겠습니다.

use db.random123 
go 
create view dbo.increasebasedonvar 
as 
select * 
from dbo.incbasedondate as ibd 
where ibd.[avg rent var] < 30 and 
    ([avg rent var] between 15 and 30 and datediff(month,ibd.leasedate, '2016-09-01') > 24) 
go 

여기 내 목표는 [평균 VAR 임대] 레코드를 제외하는 것입니다> = 30이며, [평균 VAR 임대]하는 경우 (포함) (15)와 사이에 기록의 일부를 제외 30 그리고 '리스 이용자'와 미래의 날짜 사이의 시간은 24 개월 미만입니다. 그런 다음이 매개 변수로 제외되지 않은 나머지 레코드를 모두 반환하려고합니다.

불행히도 나는 이것을 어떻게 성취 할 수 있는지 완전히 확신 할 수는 없지만 if 문을 조합하려고 시도했지만 적절하게 작동하지 않는 것 같습니다. 어떤 도움이라도 대단히 감사하겠습니다.

편집 ------------------------------------------

그래서 select 쿼리에서 도우미 열을 만들어 다른 경로를 시도하기로 결정했습니다. 이것은 내가 지금 가지고있는 것입니다.

use Random 
go 
create view dbo.incbasedondate 
as 
select 
    riv.unitcode, 
    riv.lcode, 
    riv.sitename, 
    riv.ledgerid, 
    riv.unitname, 
    riv.tenantid, 
    riv.sfname, 
    riv.slname, 
    riv.scompany, 
    riv.stdrate, 
    riv.rent, 
    riv.[std rate variance], 
    riv.[average rent], 
    riv.[avg rent var], 
    **case 
     when riv.[avg rent var] not between 15 and 30 
     then 1 
     else 
      case 
       when (riv.[avg rent var] between 15 and 30) and datediff(month,riv.leasedate, '2016-09-01') > 24 
       then '15-30 inc' 
       else null 
      end 
     end as [15-30 Increase],** 
    riv.leasedate, 
    riv.rentlastchanged, 
    riv.[Days Same], 
    riv.[Days Same Form], 
    riv.paidthrudate, 
    riv.schedrent, 
    riv.schedrentstart, 
    riv.tenzip, 
    riv.sitezip 
from dbo.rentincreaseview as riv 
where 
    ([days same form] <= 9 and 
    datediff(month, leasedate,'2016-09-01') >= 8) 
    or([days same form] >9 and 
    datediff(month, rentlastchanged,'2016-09-01') >= 12) 
go 

drop view dbo.FinalIncDataSet 
use Random 
go 
create view dbo.FinalIncDataSet 
as 
**select * 
from dbo.incbasedondate as ibd 
where ibd.[avg rent var] < 30 and ibd.[15-30 Increase] is not null 
order by ibd.unitcode** 

go 

이이 문제에 대한 핵심 부품 인 :

case 
      when riv.[avg rent var] not between 15 and 30 
      then 1 
      else 
       case 
        when (riv.[avg rent var] between 15 and 30) and datediff(month,riv.leasedate, '2016-09-01') > 24 
        then '15-30 inc' 
        else null 
       end 
      end as [15-30 Increase],** 


**select * 
    from dbo.incbasedondate as ibd 
    where ibd.[avg rent var] < 30 and ibd.[15-30 Increase] is not null 
    order by ibd.unitcode** 

그리고 거의 모든이 제거되고처럼 지금 내 결과가 더 잘못, 그것은 보인다. 성명서 작성시 중첩 된 케이스에 문제가 있습니까?

답변

0

제외 기준은 [avg rent var]이 30 이상인 레코드를 제외하고 [avg rent var]가 15와 30 사이의 값이고 'leasedate'사이의 시간 인 경우 레코드의 하위 집합을 제외합니다. 미래의 날짜는 24 개월 미만입니다.

쿼리의이 부분은 제외하려는 레코드를 포함하지 않을까요?

([avg rent var] between 15 and 30 and ...) 

방법에 대해 다음과 같이 WHERE 조건을 변경 - 그것은 조금 복잡한 보인다,하지만 우리는 여기에서 제외 기준에 일치하는 두 가지 세트에서 찾고있다

where ibd.[avg rent var] < 30 or 
    not ([avg rent var] between 15 and 30 and datediff(month,ibd.leasedate, '2016-09-01') < 24) 

. 희망이 도움이됩니다.

+0

이론 상으로는 임대 날짜와 미래 날짜 사이의 시간이 24 개월 미만인 경우 [avg rent var]가 15에서 30 사이 인 레코드를 제외하는 IF 문을 작성하려고했습니다. 그러나 내가 그 반대일지도 모르는 것처럼 보입니다. 나는 사용할 올바른 구문에 매달렸다. – sccrbrg

+0

만약 내가 그것을 바꿀 수 없다면 15에서 30 사이의 모든 기록을 제외시키지 않겠습니까? 시차가 24 개월 이상인 경우 15 세에서 30 세 사이의 기록을 포함하고 싶습니다. – sccrbrg

+0

방금 ​​전에 작성한 의견을 바탕으로 답변을 수정했습니다. 그에 따라 코드를 변경하고 체크 아웃 할 수 있습니다. –

관련 문제