2017-07-11 23 views
0

私はSSRSレポートを作成しており、2つのテーブルを結合するという決定に対してユーザ入力を許可しています。彼らはNo(0)を選択した場合は、このクエリが実行されます。ユーザ入力に基づく条件付き結合

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 

彼らはYes(1)は、追加のクエリに追加された参加]を選択した場合:

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 

Caseステートメントまたは類似した何かを持ってする方法はあります私は完全に異なる2つのクエリを持つ必要はありませんか?私は

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) 

をしようとしていますしかし、それは私にエラー(不適切な構文近い「BKARRIVE」)

答えて

2

がはい(1)/いいえ(0)@parameterでユーザーが選択しているあなたのパラメータを言うことができますを与えています。 2番目の結合条件に@parameter = 1を追加するだけです。そうすれば、@parameterでyesが選択された場合、joinは有効なデータで実行されます。私はクエリをテストしていませんが、論理的にはあなたのために動作するはずです。

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

(それはです@paremeterの代わりに何を使用していたのか)。しかし、それが0の場合、私のクエリは何も返しません。 – gilliduck

+0

私はそれをleft joinとwhere節の別の条件で更新しました。それが動作するかどうか確認できますか? – CuriousKid

+0

余分な句と句がありません。 SearchFunが1の場合は7を、SearchFunが0の場合は0を返します(51を取得する必要があります)。 – gilliduck

0

実行する前に、あなたの作成した文を参照してくださいするwhere句

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

使用する前に選択@queryをスペースを使用して@SearchFun = 1場合は作業を行い

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 
関連する問題