0

私は自分の考えで間違った道を進んでいる可能性が非常に高く、これからリラックスしようとすることで、今日の私になりました. ここで...助けを求めています。

週末を除くトランザクションの日付をいつまでに完了する必要があるかを示す長い Case When ステートメントを作成し、「Required SLA Date」と名付けました。

私がやろうとしているのは、「はい、トランザクションは SLA 日付またはそれ以前に完了しました」という列を作成することです。またはいいえ、それは後に完了しました。私のロジックは、「eventCompleteDate」が> Required SLAの場合、「はい」の場合、「いいえ」の場合はMetSLAとして終了する別のケースステートメントで、以下のケースステートメントを使用することでした

  CASE WHEN Doc IN ( 'POS', 'Card' )
         THEN CAST(DATEADD(d, CASE DATEPART(dw, DateEntered)
                                WHEN 7 THEN 2
                                WHEN 1 THEN 1
                                ELSE 0
                              END, DateEntered) + ( DATEPART(dw,
                                                          DATEADD(d,
                                                          CASE DATEPART(dw,
                                                          DateEntered)
                                                          WHEN 7 THEN 2
                                                          WHEN 1 THEN 1
                                                          ELSE 0
                                                          END, DateEntered))
                                                    - 2 + 5 ) % 5
              + ( ( DATEPART(dw, DATEADD(d, CASE DATEPART(dw, DateEntered)
                                              WHEN 7 THEN 2
                                              WHEN 1 THEN 1
                                              ELSE 0
                                            END, DateEntered)) - 2 + 5 )
                  / 5 ) * 7 - ( DATEPART(dw,
                                         DATEADD(d,
                                                 CASE DATEPART(dw,
                                                          DateEntered)
                                                   WHEN 7 THEN 2
                                                   WHEN 1 THEN 1
                                                   ELSE 0
                                                 END, DateEntered)) - 2 ) AS DATE)
         ELSE CAST(DATEADD(d, CASE DATEPART(dw, DateEntered)
                                WHEN 7 THEN 2
                                WHEN 1 THEN 1
                                ELSE 0
                              END, DateEntered) + ( DATEPART(dw,
                                                          DATEADD(d,
                                                          CASE DATEPART(dw,
                                                          DateEntered)
                                                          WHEN 7 THEN 2
                                                          WHEN 1 THEN 1
                                                          ELSE 0
                                                          END, DateEntered))
                                                    - 2 + 10 ) % 5
              + ( ( DATEPART(dw, DATEADD(d, CASE DATEPART(dw, DateEntered)
                                              WHEN 7 THEN 2
                                              WHEN 1 THEN 1
                                              ELSE 0
                                            END, DateEntered)) - 2 + 10 )
                  / 5 ) * 7 - ( DATEPART(dw,
                                         DATEADD(d,
                                                 CASE DATEPART(dw,
                                                          DateEntered)
                                                   WHEN 7 THEN 2
                                                   WHEN 1 THEN 1
                                                   ELSE 0
                                                 END, DateEntered)) - 2 ) AS DATE)
    END AS 'Required SLA Date'     
4

2 に答える 2

2

ネストされたクエリ (または CTE) を使用して、ロジックを 2 回記述しないようにします。

SELECT RequiredSlaDate, 
       case when RequiredSlaDate > EventCompleteDate then 'NO' 
            else 'YES' 
       end as MetSLA
FROM
(
   SELECT EventCompleteDate, 
          CASE WHEN Doc -- etc, etc ...
          AS RequiredSlaDate
   FROM Table
 ) as Source
于 2013-08-06T14:22:30.420 に答える
2

CTE ソリューションの例を次に示します。これまでのクエリ全体が CTE 内に入り、select from CTE は新しい列を追加するだけです。

WITH CTE AS 
(
   SELECT CASE WHEN Doc IN ( 'POS', 'Card' )
               THEN .... --your whole CASE from above goes here, I will not copy/paste
          END AS [Required SLA Date],
     eventCompleteDate,
     YourOtherColumns -- also all other columns you are selecting in your query
   FROM
   YourTable
)
SELECT *,
   CASE WHEN eventCompleteDate > [Required SLA Date] THEN 'Yes' ELSE 'No' END AS MetSLA
FROM CTE

SQLFiddle 非常に単純化されたデモ

PS: また、列に in のように名前を付けるときは、引用符を使用しないでください。AS 'Required SLA Date'代わりに角括弧を使用してくださいAS [Required SLA Date]。読みやすさのために他に何もない場合。

于 2013-08-06T15:06:48.217 に答える