2016-07-01 5 views
0

where句の制約に関してもう1つ質問があります。ここに私のコードです: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との間にあるレコードのサブセットを除外「リース期間」と将来の日付との間の時間は24ヶ月未満である。次に、これらのパラメータによって除外されていない残りのレコードをすべて返したいと思います。

残念ながら、これを達成する方法を完全にはわかりませんが、ifステートメントを組み立ててみましたが、それは適切に機能していないようです。どんな助けでも大歓迎です。

編集------------------------------------------

私は、選択クエリでヘルパー列を作成して別のルートを試してみることにしました。これは今私が持っているものです。

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

私はそれをnotに変更すれば、15から30の間のすべてのレコードを除外しませんか?時差が24ヶ月を超えている限り、私は15から30の間の記録を含めたいと思う。 – sccrbrg

+0

私はちょうどあなたの前のコメントに基づいて私の応答を改訂しました。それに応じてコードを変更してチェックアウトすることができます。 –

関連する問題