相对于月份名称和年份,将行转换为CALENDAR_DATE的列

时间:2013-12-30 10:13:32

标签: sql-server

我是SQL Server的新手,我遇到了这个问题,请你就此提供帮助。 我正在使用SQL Server 2008

我有两张桌子

表1:CALENDAR_DIMENSION

Row_Seq(numeric(5,0), null)
CALENDAR_YEAR(int, null)
CALENDAR_MONTH_NO(int, null)
CALENDAR_MONTH_NAME(varchar(15), null)
CALENDAR_DATE(date, null)

表2:HOLIDAY_DETAILS

CALENDAR_DATE(date, not null)
DESCRIPTION (varchar(50), null)
CALENDAR_DAY_NAME(varchar(15), null)
IS_WORKING_DAY(int, null)

我的要求是从CALENDAR_DATE获取HOLIDAY_DETAILS下面两个表中的数据,它应该从列{n} IS_WORKING_DAY中选择Working Day = 1 Holiday = 0 表中的值(0 =假日,1 =工作日)

Calendar_Year Calendar_Month_No Calendar_Date
2014 1 01-01-2014 02-01-2014 03-01-2014 04-01-2014 05-01-2014 ...... 31-01-2014 2014 2 01-02-2014 02-02-2014 03-02-2013 03-02-2013 04-02-2013 ...... 28-02-2014 2014 3 01-03-2014 02-03-2014 03-03-2014 04-03-2014 05-03-2014 ...... 31-03-2014

加入CALENDAR_DIMENSION后,结果应该是这样的。首先,我需要以水平方式处理所有CALENDAR-YEAR,CALENDAR_MONTH和CALENDAR_DAYS,如下面HOLIDAY_DETAILS表中的示例所示,然后想要加入表CALENDAR_DIMENSION以获取日期的IS_WORKING_DAY状态。
Calendar_Year Calendar_Month_No Calendar_Date
2014 1 1 1 1 0 0 ...... 1             2 0 0 1 0 0 ...... 1             3 0 0 1 0 0 ...... 1

{{1}}

1 个答案:

答案 0 :(得分:0)

根据我YEAR_MONTH-DAY是无用的。我不会创建这个表。你可以根据你的要求验证我的脚本并说明它不会起作用。验证后你可以轻松加入假期表。

Declare @year varchar(4)=2014

;with cte as
(
select @year calyear,1 monthno,cast(@year+'-'+'1'+'-'+'1' as date) as date1,cast(@year+'-'+'1'+'-'+'2' as date) date2,cast(@year+'-'+'1'+'-'+'3' as date) date3,cast(@year+'-'+'1'+'-'+'4' as date) date4,cast(@year+'-'+'1'+'-'+'5' as date) date5,cast(@year+'-'+'1'+'-'+'6' as date) date6,cast(@year+'-'+'1'+'-'+'7' as date) date7
union all
select calyear,monthno+1,dateadd(month,1, date1),dateadd(month,1, date2),dateadd(month,1, date3),dateadd(month,1, date4),dateadd(month,1, date5),dateadd(month,1, date6),dateadd(month,1, date7) from cte where calyear=2014 and monthno<=11

)
select * from cte