2013-05-09 142 views
0

我的查询嵌套Case语句在SQL查询

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]具有值大于@To然后@To值应打印否则[开始日期]列

我怎样才能把它写在相同的查询?

我想什么

 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 SERVER 2008

+1

你在修改上面提到的查询方式时得到的错误是什么? – 2013-05-09 12:06:08

+0

乍一看,您嵌套'CASE-END'查询看起来很合理。它出什么问题了?你有任何错误?你的结果与你期望看到的不同吗? – 2013-05-09 12:46:17

回答

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)+'' 

外应用用于指定每行一个计算值,从上面的连接表中引用值,但在那之后它就像来自JOIN的数据。所以你给你的APPLY一个别名,就像它是一个表一样,然后根据需要多次访问它的值。

正如你所看到的,这大大简化了您的query--适用是非常方便的在你的工具带。)))

编辑新增根据注释另一ISNULL。

+0

在外部应用...情况下,否则结束条件来吧?因为我在我的选择查询中有相同的... – Shaggy 2013-05-10 09:30:16

+0

U忽略那一个 – Shaggy 2013-05-10 09:30:38

+0

这应该由外部查询中的CASE中的ISNULL来处理,如果它不是NULL,它将使用第一个值,否则第二个值。经过反思,你也可能在ELSE块中需要它。我会编辑我的答案。 – 2013-05-10 11:37:20