2016-07-01 8 views
0

Ich habe eine andere Frage in Bezug auf Einschränkungen in der Where-Klausel. Hier ist mein Code:SQL Einstellung Constraints In Where-Klausel, nicht sicher, was zu tun ist

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 

Mein Ziel hier ist Datensätze auszuschließen, in denen die [avg mieten var] ist> = 30 und eine Teilmenge der Datensätze ausschließen, wenn die [avg var mieten] ist zwischen (einschließlich) 15 und 30 und die Zeit zwischen dem Leasingzeitpunkt und einem zukünftigen Datum beträgt weniger als 24 Monate. Dann möchte ich alle verbleibenden Datensätze, die nicht durch diese Parameter ausgeschlossen sind, zurückgeben.

Leider bin ich mir nicht ganz sicher, wie ich das erreichen kann. Ich habe versucht, eine if-Anweisung zusammenzustellen, aber das schien nicht richtig zu funktionieren. Jede Hilfe würde sehr geschätzt werden.

BEARBEITEN ------------------------------------------

Also entschied ich mich, eine andere Route zu versuchen, indem ich eine Helferspalte in der Select-Abfrage erstellte. Das habe ich jetzt.

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 

Dies sind die wichtigsten Teile für dieses Problem:

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** 

Und nun meine Ergebnisse sind noch falsch, es sieht aus wie fast alles eliminiert wird. Gibt es ein Problem mit meinem verschachtelten Fall bei der Anweisung?

Antwort

0

Ihre Ausschlusskriterien sind - Datensätze ausschließen, bei denen die [durchschnittliche Miete]> = 30 ist und eine Teilmenge von Datensätzen ausschließt, wenn die [durchschnittliche Miete] zwischen (einschließlich) 15 und 30 und die Zeit zwischen dem Leasingverhältnis liegt "und ein zukünftiges Datum ist weniger als 24 Monate.

Würde dieser Teil der Abfrage auch Datensätze enthalten, die Sie ausschließen möchten?

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

Wie wäre es, wenn Bedingung wie folgt zu ändern -

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

Es ist ein wenig verworren scheint, aber wir betrachten zwei verschiedene Sätze, die Ausschlusskriterien hier entsprechen. Hoffe das hilft.

+0

Theoretisch versuchte ich eine IF-Anweisung zu erstellen, die Datensätze ausschließen würde, bei denen [avg rent var] zwischen 15 und 30 liegt, wenn die Zeit zwischen dem Leasingdatum und dem zukünftigen Datum weniger als 24 Monate beträgt. Aber es sieht so aus, als hätte ich das Gegenteil getan. Ich bin auf die richtige Syntax zu verwenden. – sccrbrg

+0

Wenn ich das zu nicht ändere, schließt das nicht alle Datensätze zwischen 15 und 30 aus? Ich möchte die Datensätze zwischen 15 und 30 einfügen, solange der Zeitunterschied mehr als 24 Monate beträgt. – sccrbrg

+0

Ich habe gerade meine Antwort basierend auf Ihrem vorherigen Kommentar überarbeitet. Sie können Ihren Code entsprechend ändern und überprüfen. –

Verwandte Themen