簡體   English   中英

如何在我的“日期維度”表中創建一列,以將“日期”列分類為該特定邏輯?

[英]How to create a column in my Date Dimension table that will classify the Date column into this specific logic?

我正在使用SQL Server 2012,並且有一個名為DateDimension的表(該表基本上是從2000-01-01開始到2020-12-31結束的每日日期的列表)。

我想向該表添加一個新列(稱為ToY ),其中將包含以下值:如果列Date落在該年的01 November和下一年的31 October之間,則該值將為'ToY xx-yy' ,其中xx是下限年份,而yy是上限年份。

為簡化起見,所有介於例如2018-11-012019-10-31之間的Dates將在該新列中使用ToY 18-19作為其值。

上述邏輯將需要應用於DateDimension表中的所有日期。

如何編寫我的SQL查詢來實現這一目標?

您可以在日期維度的頂部構建視圖並執行此操作,也可以更新列,由您自己決定。 希望這能使您更進一步

with dates as (

select '1999-11-01' as FromDate,'2000-10-31' as ToDate
Union all
select '2000-11-01' as FromDate,'2001-10-31' as ToDate
Union all
select '2001-11-01' as FromDate,'2002-10-31' as ToDate
Union all
select '2002-11-01' as FromDate,'2003-10-31' as ToDate
Union all
select '2003-11-01' as FromDate,'2004-10-31' as ToDate
Union all
select '2004-11-01' as FromDate,'2005-10-31' as ToDate
union all
select '2005-11-01' as FromDate,'2006-10-31' as ToDate
union all
select '2006-11-01' as FromDate,'2007-10-31' as ToDate
Union all
select '2007-11-01' as FromDate,'2008-10-31' as ToDate
Union all
select '2008-11-01' as FromDate,'2009-10-31' as ToDate
Union all
select '2009-11-01' as FromDate,'2010-10-31' as ToDate
Union all
select '2010-11-01' as FromDate,'2011-10-31' as ToDate
Union all
select '2011-11-01' as FromDate,'2012-10-31' as ToDate
Union all
select '2012-11-01' as FromDate,'2013-10-31' as ToDate
Union all
select '2013-11-01' as FromDate,'2014-10-31' as ToDate
Union all
select '2014-11-01' as FromDate,'2015-10-31' as ToDate
Union all
select '2015-11-01' as FromDate,'2016-10-31' as ToDate
Union all
select '2015-11-01' as FromDate,'2017-10-31' as ToDate
Union all
select '2017-11-01' as FromDate,'2018-10-31' as ToDate
Union all
select '2018-11-01' as FromDate,'2019-10-31' as ToDate
Union all
select '2019-11-01' as FromDate,'2020-10-31' as ToDate
Union all
select '2020-11-01' as FromDate,'2021-10-31' as ToDate
Union all
select '2021-11-01' as FromDate,'2022-10-31' as ToDate
)

SELECT [DateKey]
      ,[PK_Date]
      ,b.FromDate
      ,b.ToDate
      ,'ToY ' + right(cast(year(FromDate) as varchar),2) + '-' +right(cast(Year(ToDate) as varchar),2)  as Toy
      ,[Date_Clean]
      ,[Date_Name]
      ,[Year]
      ,[Year_Name]
      ,[Year_Int]
      ,[Quarter]
      ,[Quarter_Name]
      ,[Month]
      ,[Month_Name]
      ,[Week]
      ,[Week_Name]
      ,[Day_Of_Week]
      ,[Day_Of_Week_Name]
      ,[Day_Of_Year]
      ,[Day_Of_Year_Name]
      ,[Day_Of_Quarter]
      ,[Day_Of_Quarter_Name]
      ,[Day_Of_Month]
      ,[Day_Of_Month_Name]
      ,[Month_Of_Year]
      ,[Month_Of_Year_Name]
      ,[Month_Of_Quarter]
      ,[Month_Of_Quarter_Name]
      ,[Quarter_Of_Year]
      ,[Quarter_Of_Year_Name]
      ,[Date_Filter]
  FROM [LegOgSpass].[dbo].[DimDate] a
  left join dates b on date_clean between b.Fromdate and b.Todate

結果

在此處輸入圖片說明

可能會有更好的方法來編寫適當的case語句,但似乎可以提供您期望的結果:

CREATE TABLE dates
(
    date_value DATE
  , ToY        AS
        RIGHT(CAST(CASE WHEN MONTH(date_value) > 10 THEN YEAR(date_value) + 1
                        ELSE YEAR(date_value)
                   END - 1 AS VARCHAR(4)), 2) + '-'
        + RIGHT(CAST(CASE WHEN MONTH(date_value) > 10 THEN YEAR(date_value) + 1
                          ELSE YEAR(date_value)
                     END AS VARCHAR(4)), 2)
);

INSERT INTO dates (date_value)
VALUES ('20180101')
     , ('20180201')
     , ('20181031')
     , ('20181101')
     , ('20181102')
     , ('20190101')
     , ('20191031')
     , ('20191101')
     , ('20191102');

SELECT date_value, ToY FROM dates;

DROP TABLE dates;

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM