Как создать столбец в моей таблице измерений даты, который будет классифицировать столбец даты в этой конкретной логике? - PullRequest
0 голосов
/ 05 июля 2018

Я использую SQL Server 2012 и у меня есть таблица с именем DateDimension (в основном это список ежедневных дат, начинающихся с 2000-01-01 и заканчивающихся 2020-12-31).

Я хочу добавить в эту таблицу новый столбец (который будет называться ToY), который будет содержать следующие значения: если столбец Date находится в пределах 01 November этого года и 31 October следующего года, значение будет «ToY xx-yy», где xx - год нижней границы, а yy - год верхней границы.

Для упрощения, все Dates, попадающие, скажем, между 2018-11-01 и 2019-10-31, будут иметь ToY 18-19 в качестве значений в этом новом столбце.

Приведенная выше логика должна применяться ко всем датам в таблице DateDimension.

Как мне написать свой SQL-запрос для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Могут быть более эффективные способы написания правильного оператора 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;

enter image description here

0 голосов
/ 05 июля 2018

Вы можете построить представление поверх вашего измерения и делать то же самое, или вы можете обновить свои столбцы, вот вам. Надеюсь, что это продвинет вас дальше

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

Результат

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...