![](/img/trans.png)
[英]How can I create a week group column in my Date Dimension Table based on this specific logic?
[英]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-01
和2019-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.