2015-10-15 66 views
0

我正在使用SQL Server 2014,並且需要編寫一個SQL查詢以更新列中的一列(稱爲ToY)我的DateDimension表。如何編寫此SQL Server語法以基於同一表中的其他兩列的值更新列

這裏是我的DateDimension表的摘錄:

Day  Month  Year   Date   ToY 
1   11  2014  2014-11-01  NULL 
2   11  2014  2014-11-02  NULL 

我需要更新基於此邏輯玩具柱:

對於2014年11月之間下降到2015年10月的所有日期,玩具會'ToY 14-15'以及2015年11月至2015年10月之間的所有日期,ToY將爲'ToY 15-16'。

例如:If月= 11和年= 2014然後玩具= '玩具14-15'

我已經試過這件作品的SQL代碼,但它不工作:

UPDATE DateDimension 

SET ToY = CASE Month+Year 

WHEN 112014 THEN 'ToY 14-15' 

ELSE ToY 

END 
GO 

我做了搜索和發現,我可以寫第三行: WHEN月= 11和年份= 2014 THEN「玩具14-15」

但我堅持的CASE語句後有什麼如下:

Set ToY = CASE ?? 
+1

還有什麼更新其他值?你能否請添加一些額外的例子? –

+1

「等等。」 - 你給我們一個例子,並期望我們根據它來辨別模式? –

+0

@Damien_The_Unbeliever我編輯了我的問題,使其更清晰。 – user3115933

回答

1

它使用的一些功能,但希望讓我的思維很清楚:

UPDATE DateDimension 

SET ToY = 'ToY ' + 
    CONVERT(char(2),DATEADD(month,-10,[Date]),12) + '-' + 
    CONVERT(char(2),DATEADD(month,2,[Date]),12) 

DATEADD(month,-10,... - 對於任何早於11月的日期,將此日期移至去年。 DATEADD(month,2,... - 對於10月以後的任何日期,請將此日期移到明年。綜合起來,這些要麼選擇去年和今年(比11月早),要麼選擇今年和明年。

CONVERT(char(2),<date>,12) - 將日期轉換爲字符串,在styleyymmdd - 但因爲我要求char(2),只保留前2個字符。

+0

太棒了!奇蹟般有效! – user3115933

1

您可以布爾表達式的情況下,如此:

update DateDimension 
set ToY = case when month = 11 and year = 2014 then 'ToY 14-15' 
      else ToY end 
0

邏輯從2014-11獲得「14-15」是不明確的。也許你每個月都加入「4」。

在任何情況下,這給出了怎麼辦基礎上,yearmonth列更新的想法:

update DateDimension 
    set ToY = 'ToY ' + right('00' + cast(year as varchar(255)), 2) + '-' + 
       right('00' + cast(month + 4 as varchar(255)), 2); 
+0

我編輯了我的問題,使邏輯更加清晰。 – user3115933

0
UPDATE DateDimension 
SET ToY = 
    CASE WHEN Month >= 11 then 
    'ToY '+cast(right(year,2) as varchar(2))+'-'+cast(right(year,2)+1 as varchar(2)) 
    WHEN Month < 11 then 
    'ToY '+cast(right(year,2)-1 as varchar(2))+'-'+cast(right(year,2) as varchar(2)) 

    ELSE ToY 
    END 

假設Year是數值,如果Year是字符串使用子字符串。

相關問題