2017-08-02 26 views
2

以下は現在のSQL Server 2012のクエリです。基本的には、最終営業日の情報が必要ですが、月曜日には、日曜日ではなく金曜日の情報を引き出すことができます。これはこれまでの私の質問にありますが、それは受け入れられません。WHERE句のケース

USE [LetterGeneration] 

SELECT 
    g.LetterGenerationPrintJobId, 
    CONVERT(CHAR(12), r.CreatedDate, 101) AS CreatedDate, 
    YEAR(r.CreatedDate) AS Year, 
    MONTH(r.CreatedDate) AS Month, 
    DAY(r.CreatedDate) AS Day, 
    CASE 
     WHEN DATEPART(dw, r.CreatedDate) = 1 
      THEN 1 
     WHEN DATEPART(dw, r.CreatedDate) = 7 
      THEN 1 
     ElSE 0 
    END AS Weekend, 
    s.LetterGenerationStatusId AS Status, 
    COUNT(g.LetterGenerationId) AS LetterCount, 
    SUM(g.LetterPageCount) AS PageCount, 
    t.IsLitigationCoverLetterAllowed, 
    CASE 
     WHEN g.CarrierTrackingNumber LIKE '%1ZE%' 
      THEN 1 
     WHEN g.CarrierTrackingNumber LIKE '921489%' 
      THEN 2 
     WHEN g.CarrierTrackingNumber LIKE '917190%' 
      THEN 2 
     ELSE 3 
    END AS CarrierType 
FROM 
    [LetterGenerationTemplateRequest] AS R 
INNER JOIN 
    [LetterGenerationTemplate] AS T ON t.[LetterGenerationTemplateId] = r.LetterGenerationTemplateId 
INNER JOIN 
    LetterGeneration G ON g.LetterGenerationTemplateRequestId = r.LetterGenerationTemplateRequestId 
INNER JOIN 
    LetterGenerationStatus S ON g.LetterGenerationStatusId = s.LetterGenerationStatusId 
WHERE 
    (CASE 
     WHEN (DATENAME(dw,GETDATE()) = 'Monday') 
      THEN (DATEDIFF(d, r.CreatedDate, GETDATE()) = 3) 
     ELSE (DATEDIFF(d, r.CreatedDate, GETDATE()) = 1) 
    END) 
    AND t.[TemplateKey] NOT LIKE '%PLTV1%' 
    AND s.LetterGenerationStatusId = 19 
ORDER BY 
    r.CreatedDate DESC, g.LetterGenerationPrintJobId DESC 

WHERE句については、私が考えている方法で動作させるために、何が分かりませんか?

ありがとうございました

答えて

1

私はそれは私が考えているように動作させるために、私のWHERE句について、何をしないか、誤解のですか?

あなたが取得しているエラーメッセージを与えられていないが、私はないそれの外に、あなたが例結果INSIDEテストを入れているので、それは構文の関連だと確信してい

あなたは」書き込みRE:

WHERE CASE WHEN it_is_monday THEN data_date = friday ELSE data_date = yesterday END 

あなたは書くべきである:

基本的に
WHERE data_date = CASE WHEN it_is_monday THEN friday ELSE yesterday END 

:あなたはどこにケース/ときを使用することになっていませんあなたの "列=何か"の比較を行い、真偽を返すには、それを使用して "列"と比較して "何か"を返して真実か偽かを判断する必要があります。

その他の答えは「あなたに実用的なソリューションを提供する」ことに焦点を当てています。

--wrong syntax to search a table full of cats (4 legs) and people (2 legs) 
WHERE CASE WHEN animal_type = 'cat' THEN legs = 4 ELSE legs = 2 END 

--right syntax 
WHERE limbs = CASE WHEN animal_type = 'cat' THEN 4 ELSE 2 END 
+0

それは本当に良い説明です。今私のケースステートメントでどこが間違っているのか理解しています。これは次のようになります: どこDATEDIFF(d、r。CreatedDateに、GETDATE())=(CASE \t \t \t \t \t \t \t \t \t \t \t \t DATENAME(DW、GETDATE())= '月曜日THEN 3 \t \t \t \t \t \t \t \t \t \t \t \t ELSE 1 \t \t \t \t \t \t \t \t \t \t \t \t end) –

4

通常のAND/ORに変換できますか?

WHERE (
    ((DATENAME(dw,GETDATE()) = 'Monday') AND (DATEDIFF(d, r.CreatedDate, GETDATE()) = 3)) 
    OR 
    (DATEDIFF(d, r.CreatedDate, GETDATE()) = 1) 
) 
.... 
+0

だけで正常に動作するようです。賢明でシンプルなソリューションに感謝します。 –

0

が第二のために休日を無視し、あなたはすべてのための少なくとも1つのレコードを持っていると仮定すると:この答えは、再あなたの元のクエリ

はここに簡単な例です、あなたの思考プロセスを間違って何が起こっていたかを伝えるに焦点を当ててこのようなものはうまくいくはずです。 SARGability(インデックスに対して追求を行うことができる)あなたは述語で表の列を任意の機能に含まれていないことを確認する必要性を維持するために

0

次の仕事とSARGabilityを維持する必要があります...

WHERE 
    r.CreatedDate = CASE 
         WHEN DATEPART(dw, getdate) = 2 
         THEN DATEADD(dd, -3, CAST(GETDATE() AS DATE)) 
         ELSE CAST(GETDATE() AS DATE) 
        END 

HTH、 ジェイソン