0

マイクエリ

Declare     @From       DateTime='01 Feb 2013'
Declare     @To         DateTime='28 Feb 2013 23:59:59'

Select 
            Case
                  When
                  (
                        Select TOP 1 f1.UpdatedOn
                        From TicketTypeFollowUp As f1 with(nolock)
                        Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket
                        Order By f1.UpdatedOn Desc
                  )IS Null
                  Then Ticket.TicketRaisedOn

                  Else
                  (
                       Select TOP 1 f1.UpdatedOn
                       From TicketTypeFollowUp As f1 with(nolock)
                       Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket
                       Order By f1.UpdatedOn Desc
                  ) End [Start Date]

      From dbo.TicketTypeFollowUp T with(nolock)
      --Some Tables Omitted          
      Where CAST(TicketRaisedOn As Date)Between ''+Convert(VarChar(19), @From, 100)+''       And ''+Convert(VarChar(19), @To, 100)+''

[Start Date]に次の値より大きい値がある場合 値を出力する必要があります@ToElse @To[Start Date] 列

どうすれば同じクエリに書き込むことができますか?

私が試したこと

       Case When(
             Case
                  When
                  (
                        Select TOP 1 f1.UpdatedOn
                        From TicketTypeFollowUp As f1 with(nolock)
                        Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket
                        Order By f1.UpdatedOn Desc
                  )IS Null
                  Then Ticket.TicketRaisedOn

                  Else
                  (
                       Select TOP 1 f1.UpdatedOn
                       From TicketTypeFollowUp As f1 with(nolock)
                       Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket
                       Order By f1.UpdatedOn Desc
                  ) End [Start Date]
              )> @To Then @To Else [Start Date] End,

DB : SQL サーバー 2008

4

1 に答える 1

2

これが必要なようです:

Declare     @From       DateTime='01 Feb 2013'
Declare     @To         DateTime='28 Feb 2013 23:59:59'

Select CASE WHEN ISNULL(StartDates.[Start Date], Ticket.TicketRaisedOn) > @To THEN @To ELSE ISNULL(StartDates.[Start Date], Ticket.TicketRaisedOn) END AS ResultValue
From dbo.TicketTypeFollowUp T with(nolock)
    --Some Tables Omitted 
    OUTER APPLY
    (
        Select TOP 1 f1.UpdatedOn AS [Start Date]
        From TicketTypeFollowUp As f1 with(nolock)
        Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket
        Order By f1.UpdatedOn Desc
    ) StartDates
Where CAST(TicketRaisedOn As Date)Between ''+Convert(VarChar(19), @From, 100)+''       And ''+Convert(VarChar(19), @To, 100)+''

OUTER APPLY を使用すると、上記の結合されたテーブルの値を参照して、行ごとに計算された値を指定できますが、その後は JOIN からのデータのようになります。したがって、APPLY にテーブルであるかのようにエイリアスを与えてから、上記で必要な回数だけその値にアクセスします。

ご覧のとおり、これによりクエリが大幅に簡素化されます。APPLY はツール ベルトにあると非常に便利です。)))

EDITコメントごとに別の ISNULL を追加しました。

于 2013-05-09T17:55:37.037 に答える