2017-07-11 7 views
0

Ich mache einen SSRS-Bericht und erlaube Benutzereingaben bei der Entscheidung, zwei Tabellen zu verbinden. Wenn sie No(0) wählen, dann ist diese Abfrage ausgeführt wird:Bedingte Verknüpfung basierend auf Benutzereingabe

select distinct case when book.PROPCODE = '00' then 'R6' else book.PROPCODE end as PROPCODE, 
     BKNAME, 
     BKARRIVE, 
     BKDEPART, 
     BKRMNUM, 
     book.BOOKID 
from NGFMBOOK book 
inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,'/','0'),'-',0))) = ltrim(rtrim(str(book.BOOKID))) 
where BKARRIVE between @StartDate and @EndDate 
and book.PROPCODE in (@PropCode) 
Order By BookID 

Wenn sie wählen Yes(1) dann eine zusätzliche Join wird der Abfrage hinzugefügt:

select distinct case when book.PROPCODE = '00' then 'R6' else book.PROPCODE end as PROPCODE, 
     BKNAME, 
     BKARRIVE, 
     BKDEPART, 
     BKRMNUM, 
     book.BOOKID 
from NGFMBOOK book 
inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,'/','0'),'-',0))) = ltrim(rtrim(str(book.BOOKID))) 
inner join [RPV1Data\RPV1Data].RP_V1Data.dbo.NGFUNCT func ON book.BOOKID = func.BOOKID --this is the extra join 
where BKARRIVE between @StartDate and @EndDate 
and book.PROPCODE in (@PropCode) 
Order By BookID 

Gibt es eine Möglichkeit, eine Case-Anweisung oder etwas ähnliches haben damit ich nicht zwei völlig unterschiedliche Abfragen haben muss? Ich versuche

set @queryHeader = 'select distinct case when book.PROPCODE = ''00'' then ''R6'' else book.PROPCODE end as PROPCODE, BKNAME, BKARRIVE, BKDEPART, BKRMNUM, book.BOOKID from NGFMBOOK book inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,''/'',''0''),''-'',0))) = ltrim(rtrim(str(book.BOOKID)))' 
set @option1 = 'inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,''/'',''0''),''-'',0))) = ltrim(rtrim(str(book.BOOKID)))' 
set @option2 = 'inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,''/'',''0''),''-'',0))) = ltrim(rtrim(str(book.BOOKID))) inner join [RPV1Data\RPV1Data].RP_V1Data.dbo.NGFUNCT func ON book.BOOKID = func.BOOKID' 
set @queryFooter = 'where BKARRIVE between @StartDate and @EndDate and book.PROPCODE in (@PropCode) Order By BookID' 
set @query = @queryHeader + case when @SearchFun = 1 then @option2 else @option1 end + @queryFooter 

exec(@query) 

Aber das gibt mir einen Fehler (falsche Syntax nahe 'BKARRIVE')

Antwort

2

Können sagen, Ihre Parameter in dem der Benutzer Ja ist die Auswahl (1)/Nein (0) ist @parameter . Fügen Sie dann @parameter = 1 in Ihre zweite Join-Bedingung ein. Wenn yes im @ Parameter ausgewählt ist, wird dieser Join mit gültigen Daten ausgeführt. Ich habe die Abfrage nicht getestet, aber logisch sollte es für Sie funktionieren.

select distinct case when book.PROPCODE = '00' then 'R6' else book.PROPCODE end as PROPCODE, 
      BKNAME, 
      BKARRIVE, 
      BKDEPART, 
      BKRMNUM, 
      book.BOOKID 
    from NGFMBOOK book 
    inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,'/','0'),'-',0))) = ltrim(rtrim(str(book.BOOKID))) 
    left join [RPV1Data\RPV1Data].RP_V1Data.dbo.NGFUNCT func ON book.BOOKID = func.BOOKID AND @parameter = 1 --this is the extra join 
    where BKARRIVE between @StartDate and @EndDate 
    and book.PROPCODE in (@PropCode) 
    and ((func.BOOKID IS NOT NULL and @parameter = 1) 
    OR @parameter = 0) 
    Order By BookID 
+0

das funktioniert, wenn @SearchFun = 1 (das ist was ich schon mal anstelle von @paremeter benutzt habe). Wenn es jedoch 0 ist, gibt meine Abfrage nichts zurück. – gilliduck

+0

Ich aktualisierte es mit linker Verknüpfung und einer anderen Bedingung in where-Klausel. Können Sie überprüfen, ob es funktioniert? – CuriousKid

+0

Verpasste das Extra und die Klausel. Jetzt bekomme ich die 7, die ich will, wenn SearchFun 1 ist, aber 0, wenn SearchFun 0 ist (sollte 51 zurück). – gilliduck

0

einen Raum Verwenden Sie vor dem where-Klausel

set @queryFooter = ' where BKARRIVE between @StartDate and @EndDate and book.PROPCODE in (@PropCode) Order By BookID' 

Verwenden einer ausgewählten @query erstellten Anweisung zu sehen, bevor es die Ausführung

Declare @queryHeader nvarchar(1000), 
@option1 nvarchar(1000),@option2 nvarchar(1000),@queryFooter nvarchar(500),@query nvarchar(max),@SearchFun int 
set @SearchFun=1 

set @queryHeader = 'select distinct case when book.PROPCODE = ''00'' then ''R6'' else book.PROPCODE end as PROPCODE, BKNAME, BKARRIVE, BKDEPART, BKRMNUM, book.BOOKID from NGFMBOOK book inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,''/'',''0''),''-'',0))) = ltrim(rtrim(str(book.BOOKID)))' 
set @option1 = 'inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,''/'',''0''),''-'',0))) = ltrim(rtrim(str(book.BOOKID)))' 
set @option2 = 'inner join NGFMBOOK2 on ltrim(rtrim(replace(replace(Uniqueid2,''/'',''0''),''-'',0))) = ltrim(rtrim(str(book.BOOKID))) inner join [RPV1Data\RPV1Data].RP_V1Data.dbo.NGFUNCT func ON book.BOOKID = func.BOOKID' 
set @queryFooter = ' where BKARRIVE between @StartDate and @EndDate and book.PROPCODE in (@PropCode) Order By BookID' 
set @query = @queryHeader + case when @SearchFun = 1 then @option2 else @option1 end + @queryFooter 


select @query 
Verwandte Themen