SQL中的IF语句

时间:2016-01-17 07:22:47

标签: sql-server

我有一个table_changes(Id,stard_date,end_date),我想添加两列rank_end_datenew_end_date

我的数据中存在的问题是,end_date和之后的start_date并不总是存在连续性(在月份级别,月份中的某一天不在我的兴趣之中)它(见例1 )所以我需要" strech" end_date在某些情况下会在一个月内保持连续性。

对于示例1 new_end_date1/2/2015,且不必为28/2/2015。如果排名1中的end_date31/12/201531/12/9999延伸到Ex1: Id --start date --end_date --rank_end_date new_end_date 111 01/01/1970 1/1/1980 2 1/2/2015 111 01/03/2015 31/12/9999 1 31/12/9999 Ex2: Id --start_date --end_date --rank_end_date new_end_date 111 01/01/1970 1/1/1980 1 31/12/9999 Ex3: Id --start_date --end_date --rank_end_date new_end_date 111 01/01/1970 1/1/1980 2 01/05/1990 111 01/05/1990 31/12/1995 1 31/12/9999 Ex4: Id --start_date --end_date --rank__end_date new_end_date 111 01/03/2015 31/12/9999 1 31/12/9999 Ex5: Id --start_Date --end_date --rank__end_date new_end_date 111 01/02/2015 31/5/2015 2 01/5/2015 111 01/06/2015 31/12/9999 1 31/12/9999

一些例子:

IF

语法应该是这样的,但我不知道如何在SQL中编写这些if rank_end_date ==2 then new_end_date == 1/Month(start_date(rank_end_date - 1)) - 1 /2015 if rank_end_date ==1 then new_end_date == 31/12/2015 else new_end_date = end_date Select [Id],[StartDate],[EndDate], Rank_End_Date, case when t.Rank_End_Date = (2) **then CAST(CAST(Year([StartDate]) AS varchar) + '-' + CAST(Month([StartDate]) AS varchar) + '-' + --How to do I choose the Start_Date from the record with Rank==1? It is selecting the start date from the record with rank==2 ofcourse. CAST(Day ([EMER_StartDate]) AS varchar) AS DATE) when t.Rank_End_Date = (1) then '9999-12-31' else t.[EMER_EndDate] end As New_End_Date from ( Select [Id],[StartDate],[EndDate], Rank() OVER (PARTITION BY [Id] order by [EndDate] desc) as Rank_End_Date from [dbo].[Changes] ) t 语句:

{{1}}

有人可以帮助实现结果吗?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题是正确的,并且你只能在rank_end_date中得到1或2的值,那么像这样的查询应该会给你你正在寻找的答案。无论哪种方式,LEAD(或LAG函数,如果您对记录进行排序)将允许您从不同的记录中获取值。

SELECT ID
     , start_date
     , end_date
     , rank_end_date
     , CASE WHEN rank_end_date = 1 THEN 
            CASE WHEN end_date < '31/12/2005' THEN '31/12/9999' ELSE end_date END
         WHEN rank_end_date = 2 THEN LEAD(start_date,1) OVER(ORDER BY ID, rank_end_date DESC)
       END AS new_end_date          
FROM dbo.Changes

答案 1 :(得分:0)

您无法在SQL Server 2008中使用LEAD OR LAG函数,因此您可以尝试此解决方案。

with CTE as
(    
    Select [Id] as ID,[StartDate] as StartDate,[EndDate] as EndDate,
    ROW_NUMBER() OVER (PARTITION BY [Id] order by  [StartDate] DESC)  as rn_Start_Date
    from [dbo].[Changes]
)

Select C1.[Id] , C1.[StartDate], C1.[EndDate], C1.rn_Start_Date as Rank_end_date,
       ISNULL(DATEADD(MONTH, DATEDIFF(MONTH, 0, C2.[StartDate])-1, 0), cast('9999-12-31' as DATE)) As New_End_Date
From CTE C1
    LEFT JOIN CTE C2 ON C1.[ID] = C2.[ID] AND C1.Rn_Start_Date = C2.Rn_Start_Date + 1