сначала получите данные календаря в работоспособном формате:
DECLARE @StartDate DATETIME, @EndDate DATETIME
SET @StartDate = '12/01/2018'
SET @EndDate = '01/31/2019'
SELECT @StartDate = DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0)) -- FirstDayOfMonth
SELECT @EndDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)) -- LastDayOfMonth
; WITH Months AS (
SELECT
[Month] = DATEPART(MONTH,DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0))),
[Year] = DATEPART(YEAR,DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0))),
FirstDayOfMonth = DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0)),
LastDayOfMonth = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)),
FirstDayOfCalendar = DATEADD(DAY,-DATEPART(WEEKDAY,DATEADD(s,0,DATEADD(mm,
DATEDIFF(m,0,@StartDate),0)))+1,DATEADD(s,0,DATEADD(mm,
DATEDIFF(m,0,@StartDate),0))),
LastDayOfCalendar = DATEADD(DAY,6-DATEPART(WEEKDAY,DATEADD(s,-1,DATEADD(mm,
DATEDIFF(m,0,@StartDate)+1,0))),DATEADD(s,-1,DATEADD(mm,
DATEDIFF(m,0,@StartDate)+1,0)))
UNION ALL SELECT
[Month] = DATEPART(MONTH,DATEADD(MONTH,1,FirstDayOfMonth)),
[Year] = DATEPART(YEAR,DATEADD(MONTH,1,FirstDayOfMonth)),
FirstDayOfMonth = DATEADD(MONTH,1,FirstDayOfMonth),
LastDayOfMonth = DATEADD(s,-1,DATEADD(mm,
DATEDIFF(m,0,DATEADD(MONTH,1,FirstDayOfMonth))+1,0)),
FirstDayOfCalendar = DATEADD(DAY,-DATEPART(WEEKDAY,DATEADD(MONTH,1,FirstDayOfMonth))+1,DATEADD(MONTH,1,FirstDayOfMonth)),
LastDayOfCalendar = DATEADD(DAY,6-DATEPART(WEEKDAY,DATEADD(s,-1,DATEADD(mm,
DATEDIFF(m,0,DATEADD(MONTH,1,FirstDayOfMonth))+1,0))),DATEADD(s,-1,DATEADD(mm,
DATEDIFF(m,0,DATEADD(MONTH,1,FirstDayOfMonth))+1,0)))
FROM
Months
WHERE
LastDayOfMonth < @EndDate
), Dates AS (
SELECT
[Month],
[Year],
[Date] = FirstDayOfCalendar,
FilterDate = LastDayOfCalendar
FROM
Months
UNION ALL SELECT
[Month],
[Year],
[Date] = DATEADD(DAY,1,[Date]),
FilterDate
FROM
Dates
WHERE
[Date] < FilterDate
)
SELECT
DisplayOnCalendar = DENSE_RANK() OVER (ORDER BY d.Year, d.Month),
d.Month,
[Day] = DATEPART(DAY,d.[Date]),
d.Year,
[WeekDay] = DATEPART(WEEKDAY, d.[Date]),
[Order] = DENSE_RANK() OVER (PARTITION BY d.Year, d.Month ORDER BY d.Date),
d.Date,
case when month(d.Date) = Month then '1' else '2' end as ID
FROM
Dates d
Далее, чтобы организовать отчет в режиме конструктора, необходимо создать три матрицы, каждая из которых будет размещена внутри друг друга:
Чем большематрица сгруппирована по строке, сгруппированной по "= DisplayOnCalender", матрица среднего размера сгруппирована по строке, сгруппированной по "= Ceiling (Fields! Order.Value / 7)" и столбцу, сгруппированному по "= Weekday".
меньшая матрица содержит выражение = IIF (Fields! ID.Value = 1, Fields! Day.Value, "")
Когда вы создали две матрицы, темно-зеленые строки фона могут быть удалены, они дают информациюдля смежных полей выражений.перетащите наименьшую матрицу в красное поле.затем перетащите эти две комбинированные матрицы в желтое поле.
Теперь ваш дизайн отчета должен выглядеть как на рисунке справа: