2017-05-25 7 views
0

Ich muss diese beiden Tabellen verbinden. Ich brauche Ereignisse auswählen, wo:Wählen Sie aus derselben Spalte unter verschiedenen Bedingungen

ex_head of_family_active = 1 AND tax_year = 2017 

und auch:

ex_head of_family_active = 0 AND tax_year = 2016 

Das erste Mal, dass ich diese beiden Tabellen zu verknüpfen habe ich versucht, die Lagerdaten dbo.tb_master_ascend AND warehouse_data.dbo.tb_master_ascend in der FROM-Klausel bekam haben denselben ausgesetzt Namen . Wie die Abfrage jetzt unten zeigt, bekomme ich einen Syntaxfehler auf dem "wo". Was mache ich falsch? Danke

use [warehouse_data] 

select 
    parcel_number as Account, 
    pact_code as type, 
    owner_name as Owner, 
    case 
     when ex_head_of_family_active >= 1 
      then 'X' 
      else '' 
    end 'Head_Of_Fam' 
from 
    warehouse_data.dbo.tb_master_ascend 
inner join 
    warehouse_data.dbo.tb_master_ascend on parcel_number = parcel_number 
where 
    warehouse_data.dbo.tb_master_ascend.tax_year = '2016' 
    and ex_head_of_family_active = 0 
where 
    warehouse_data.dbo.tb_master_ascend.t2.tax_year = '2017' 
    and ex_head_of_family_active >= 1 
    and (eff_from_date <= getdate()) 
    and (eff_to_date is null or eff_to_date >= getdate()) 

@marc_s änderte ich die, wo Aussagen und meinen Code aktualisiert jedoch der Filter nicht funktioniert jetzt:

use [warehouse_data] 

    select 
    wh2.parcel_number as Account 
    ,wh2.pact_code as Class_Type 
    ,wh2.owner_name as Owner_Name 

    ,case when wh2.ex_head_of_family_active >= 1 then 'X' 
     else '' 
    end 'Head_Of_Fam_2017' 

    from warehouse_data.dbo.tb_master_ascend as WH2 
      left join warehouse_data.dbo.tb_master_ascend as WH1 on ((WH2.parcel_number = wh1.parcel_number) 
      and (WH1.tax_year = '2016') 
      and (WH1.ex_head_of_family_active is null)) 
    where WH2.tax_year = '2017' 
      and wh2.ex_head_of_family_active >= 1  
      and (wh2.eff_from_date <= getdate()) 
      and (wh2.eff_to_date is null or wh2.eff_to_date >= getdate()) 
+1

Der Syntaxfehler ist, dass man ** kann nicht ** ** haben zwei ** 'WHERE' Klauseln in einem T-SQL-Anweisung –

+0

ich aber bin mit MSSQL. Ich sollte zwei verwenden können, wo richtig? – Tommy

+0

*** NEIN *** - Sie *** *** KANN NICHT zwei 'WHERE' Klauseln in einer T-SQL-Anweisung haben. Sie * können * jedoch Bedingungen mit 'AND' und' OR' kombinieren - aber es kann ** nur eine sein ** 'WHERE' Klausel –

Antwort

0

ich einen CTE verwenden würden alle Ihre Pakete zu erhalten, die Ihre 2016 Regeln treffen .

Dann treten Sie das gegen Ihre 2017 Regeln auf Parzelle ID.

ich zusammenfassend:

with cte as 
(
select parcelID 
from 
where [2016 rules] 
group by parcelID --If this isn't unique you will cartisian your results 
) 

select columns 
from table 
join cte on table.parcelid=cte.parcelID 
where [2017 rules] 
+0

Danke, das hat super funktioniert. Welche Einschränkungen gibt es bei der Verwendung von CTE? – Tommy

+0

@Tommy - CTEs sind im Wesentlichen eine Unterabfrage. Wo es in der unteren Abfrage steht, könntest du es mit der select-Anweisung ersetzen. Es ist meine Präferenz, sie für die Ordentlichkeit der Frage zu trennen. Wenn meine Antwort Ihr Problem gelöst hat, können Sie es als Antwort markieren. Vielen Dank. – KeithL

+0

Danke, ja, es hat getan. Wie du oben sehen kannst, ging ich die select-Anweisung route. Wurde darauf hingewiesen, dass dies ein besserer Weg war, weshalb ich die Beschränkungen fragte. Ich bevorzugte auch die CTE-Route, da sie meinen Denkprozess für diese spezielle Abfrage besser darzustellen schien. Ich bin ein Anfänger für MSSQL, also war das sehr hilfreich. – Tommy

Verwandte Themen