63

SQL サーバーで IF ステートメント型の関数を実行しようとしています。

フィールドに NULL がある場合、テーブルの 1 つからフィールドを取得し、それに 10 日を追加します。

可能であれば、別の列を作成して 30 日を追加します。

SELECT DISTINCT
    B.[ID],
    MAX(A.[START DATE]),
    B.[STAT],
    C.[POST DATE],
    CASE
          WHEN (C.[POST DATE] BETWEEN C.[EVENT DATE]+10 AND C.[EVENT DATE]+30) THEN 'GOOD'
          END AS [BETTER VISIT],
    CASE
          WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)
          ELSE '-'
          END AS [DATE]
FROM 
    #TEMP1 A
    FULL OUTER JOIN #TEMP2 B
    ON A.[ID]=B.[ID]
    FULL OUTER JOIN #TEMP3 C
    ON A.[ID]=C.[ID]
GROUP BY
    B.[ID],
    B.[STAT],
    C.[POST DATE],
    C.[EVENT DATE]
ORDER BY
    A.[START DATE] DESC

結果は次のようになります。

    ID  START DATE   STAT    POST DATE    BETTER VISIT    DATE         DATE2
    ---------------------------------------------------------------------------
    1   2013-01-01   GOOD    2013-11-01   GOOD            -            -
    2   2013-03-01   NULL    NULL         NULL            2013-03-11   2013-03-31
4

8 に答える 8

17

ハイフンを に置き換える必要があるという Joachim の意見に同意しますNULL。ただし、本当にハイフンが必要な場合は、日付を文字列に変換します。

(CASE WHEN B.[STAT] IS NULL
      THEN convert(varchar(10), C.[EVENT DATE]+10, 121)
      ELSE '-'
 END) AS [DATE]

また、あなたの声明distinctでは不要です。selectgroup byすでにこれを行っています。

于 2013-07-25T23:24:30.330 に答える
5
  case isnull(B.[stat],0)
  when 0 then dateadd(dd,10,(c.[Eventdate]))
  end

同じに 30 日を追加する場合は、else ステートメントに追加できます。

于 2013-07-25T21:51:49.683 に答える
4

この状況では、CASE 式の代わりに ISNULL() 関数を使用できます。

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
于 2016-08-27T08:31:33.500 に答える
1

ELSE ステートメントのハイフンは、datetime データ型で定義されている列では受け入れられません。次のいずれかを実行できます。

a) [stat] フィールドを CAST でラップして、日付の varchar 表現に変換します

b) ELSE 値に 9999-12-31 のような日時を使用します。

于 2013-07-25T21:51:39.723 に答える