【问题标题】:CALENDAR DATES Convert to rows with Holidays updating with the status日历日期转换为带有假期更新状态的行
【发布时间】:2014-01-06 09:23:20
【问题描述】:

我有一张Holiday_Details餐桌

下表a中的列

CALENDAR_DATE, Day1,Day2,Day3,Day4,Day5,Day6,Day7,Day8,Day9,Day10,Day11,Day12,Day13,    Day14,Day15,Day16,Day17,Day18,Day19,Day20,Day21,Day22,Day23,Day24,Day25,Day26,Day27,    Day28,Day29,Day30,Day31 the columns from Day1 to Day31 are having null values.

Year    Month     Days
2014    1   01-01-2014
2014    1   02-02-2014
2014    1   03-03-2014
2014    1   04-03-2014
2014    1   05-03-2014

现在我想要的结果如下:

结果

Year    Month   Day1    Day2    Day3    Day4    Day5    Day6    Day31   
2014    1   1   1   1   0   0   ……. 1   
2014    2   0   0   1   0   0   ……. 1   
2014    3   0   0   1   0   0   ……. 1

工作日 = 1 (周一、周二、周三、周四、周五)
假期 = 0(周六、周日)

请告诉我如何将 CALENDAR_DATES 列转换为分别对应每个月和年的行。请帮助我,因为我无法获得如上所示的订单。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    测试表:

    create table dates(Year int, Month int, Days int, date date)
    
    ;with cte as
    (
    select 0 x
    union all
    select x + 1
    from cte 
    where x < 364
    )
    insert dates
    select 2014, month(dateadd(d, x, '20140101')), day(dateadd(d, x, '20140101')), dateadd(d, x, '20140101')
    from cte
    option (maxrecursion 0)
    

    查询:

    select * 
    from 
    (
      select year, month, days, case when datediff(d, 0, date)%7 in (5,6) 
      then 0 else 1 end status 
      from dates
    ) x
    pivot (max(status) for Days in (
     [1], [2], [3], [4], [5], [6], [7], [8], [9],[10],
    [11],[12],[13],[14],[15],[16],[17],[18],[19],[20],
    [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]
    )) as pvt
    

    Fiddle

    【讨论】:

      【解决方案2】:

      试试这个:

      ;with CalendarDate as 
      (
      Select 1 as Level , convert(date,'20140101') as myDate 
      union all 
      Select Level +1 , dateadd(day,1,myDate)  from CalendarDate
      where Level<100
      )
      Select Year,Month,
      [Day1],[Day2],[Day3],[Day4],[Day5],[Day6],[Day7],[Day8],[Day9],[Day10],[Day11],[Day12],   [Day13],[Day14],[Day15],[Day16],[Day17],[Day18],[Day19],[Day20],[Day21],[Day22],[Day23],   [Day24],[Day25],[Day26],[Day27],[Day28],[Day29],[Day30],[Day31] 
      from 
      (
      Select myDate,
             year(myDate) as Year,
             Month(myDate) as Month,
             case when datename(Weekday,myDate) in ('Saturday','Sunday')
                  then 'Weekend'
                  ELSE
                 'Day'+convert(varchar(3),day(myDate))
            END as Col1
      from CalendarDate 
       ) pv
      pivot 
      (
       count(myDate)
       for Col1 in 
       ([Day1],[Day2],[Day3],[Day4],[Day5],[Day6],[Day7],[Day8],[Day9],[Day10],[Day11],[Day12],[Day13],[Day14],[Day15],[Day16],[Day17],[Day18],[Day19],[Day20],[Day21],[Day22],[Day23],[Day24],[Day25],[Day26],[Day27],[Day28],[Day29],[Day30],[Day31] 
       )
      ) 
      pvt
      

      结果:- SQL Fiddle

      【讨论】:

      • 我一定会的。看看月底的所有周末(试试我的答案)
      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多