2014-01-06 105 views
0

我有一個表Holiday_Details日曆日期轉換爲行與假期與狀態更新

列在表下方

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與相應的轉換爲行各月份和年份。請幫助我,因爲我無法獲得此訂單,如上所示。

回答

0

試試這個:

;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

+1

我不想爲你工作,它永遠不是週末 –

+0

我希望現在你可以爲我工作:) – praveen

+0

我肯定會的。在月末查看所有周末(試試我的答案) –

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