2016-05-20 3 views
2

where文節内にcase文を記述しようとしています。以下は私の質問です。私は平日に基づいてクエリを実行したい。基本的に月曜日の場合は、datecreated = getdate() - 3 の火曜日の場合、getdate() - 3とgetdate() - 1の範囲内で日付を設定する必要があります。 wed-fridayならばdatecreated = getdate() - 1case文where句内の曜日によって異なります。

SELECT Count(dispute_reference_no)AS reg_inc 
FROM mytable 
WHERE reasoncd IN ('b2', 'b3') 
AND datecreated = ( 
     CASE 
      WHEN Datename(weekday,Getdate()) = 'Monday' THEN dbo.Fn_getdateonly(Getdate()-3)) 
      WHEN datename(weekday,getdate()) = 'tuesday' THEN (dbo.fn_getdateonly(getdate()-3) 
AND dbo.fn_getdateonly(getdate())) 
ELSE dbo.fn_getdateonly(getdate()-1) 
END) 

上記のコードは機能しません。 case文の中に範囲を追加することはできません。

+1

あなたが望むものを知っていることは非常に難しいが、あなたの括弧がオンになっています間違った場所 –

+0

'CASE'を使う正しい方法は' CASE いつ... いつ... END 'あなたのENDは' Case'に関連していません – demo

+0

エラーを忘れました。あなたは 'レンジを作る必要があるのですか?'あなたは 'CASE'で範囲を作成し、単一の値である –

答えて

1

あなたは動的にこのようなあなたのwhere句を書き換えることはできませんが、論理演算子のシリーズを使用することによって、所望の動作を得ることができます:

SELECT COUNT(Dispute_Reference_no) AS reg_inc 
FROM mytable 
WHERE reasoncd in ('b2', 'b3') AND 
     ((DATENAME(weekday, GETDATE()) = 'monday' AND 
     datecreated = dbo.fn_getdateonly(GETDATE()-3)) OR 
     (DATENAME(weekday, GETDATE()) = 'tuesday' AND 
     datecreated BETWEEN dbo.fn_getdateonly(GETDATE()-3) AND 
          dbo.fn_getdateonly(GETDATE())) OR 
     (atecreated = dbo.fn_getdateonly(GETDATE()-1) 
     )