1

Я создаю отчет и хотел бы получить данные на основе поля даты (строки) в формате YYYYWW. Я хочу отфильтровать данные, чтобы получить текущий месяц, предыдущий месяц, месяц до этого и более старые значения - используя 4 разных набора данных.Преобразование «YYYYWW» в месяц (SSRS)

Например: 201547 = November 2015

Как создать вычисляемый элемент, который преобразует строку в название месяца и год? Я хотел бы использовать это значение для фильтрации данных из куба. Есть ли другой способ сделать это?

[Here is a screen shot of my report:] 1

+2

Имейте в виду, что «неделя» не сопоставляется непосредственно с «месяцем» последовательно. Как вы собираетесь обрабатывать недели, разделенные на два месяца, например. Понедельник - 30 июня, вторник - 1 июля - в какой месяц вы собираетесь конвертировать на этой неделе? Для этого вам необходимо установить некоторые бизнес-правила.Вам также нужно знать, когда начинается «неделя 1» - нумерация недели может быть связана с * финансовым годом *, а не с календарным годом. – Nathan

+0

Большое вам спасибо за быстрый ответ !! Я дам вам, ребята, знать, как это получилось завтра. – krynil

ответ

1

Попробуйте добавить вычисляемое поле и установите его в этом выражении:

=MonthName(Month(DateAdd("ww",CInt(MID("201547",5,LEN("201547"))) 
,DateSerial(CInt(LEFT("201547",4)),1,1)))) & " " & LEFT("201547",4) 

Затем используйте это поле, чтобы отфильтровать отчет.

Заменить строку для поля возвращения «201547»

=MonthName(Month(DateAdd("ww", 
CInt(MID(Fields!YearWeek.Value,5,LEN(Fields!YearWeek.Value))) 
,DateSerial(CInt(LEFT(Fields!YearWeek.Value,4)),1,1)))) 
& " " & LEFT(Fields!YearWeek.Value,4) 

UPDATE: MDX скрипт для запрашивая вычисляемого элемента с требуемым форматом:

Я проверил со следующим MDX:

WITH MEMBER [Measures].[month&year] AS 
    'FORMAT(DateAdd("ww",STRTOVALUE(MID("201547",5,LEN("201547"))) ,CDATE(DateSerial(LEFT("201547",4),1,1))),"MMMM") + " " + LEFT("201547",4)' 
SELECT { [month&year] } ON COLUMNS 
FROM [Your Cube] 

Чтобы использовать его в запросе заменить "201547" для [Dimension].[Attribute].MemberValue, что соот- ветствовать пруды в вашу структуру кубы:

WITH MEMBER [Measures].[month&year] as 
'FORMAT(DateAdd("ww",STRTOVALUE(MID([Dimension].[Attribute].MemberValue,5,LEN([Dimension].[Attribute].MemberValue))) 
,CDATE(DateSerial(LEFT([Dimension].[Attribute].MemberValue,4),1,1))),"MMMM") + " " + LEFT([Dimension].[Attribute].MemberValue,4)' 
SELECT 
    { [Dimension].[Attribute].[Attribute] } 
    {[month&year]} ON COLUMNS 
FROM [Your Cube] 

После того как вы это поле в наборе данных можно легко отфильтровать значения с помощью параметра.

Сообщите мне, если это может вам помочь.

0

Часть 1: Установление какой день приходится на который неделю
ISO-8601 объявляет международные стандарты для преобразования дат в неделю числа, и наоборот.

Стандартные недели ISO начинаются в понедельник. Год может иметь 52 или 53 недели.

Существует 4 способа установления, когда начинается 1 неделя:
- Это первая неделя с большинством (4 или более) ее дней в январе.
- Его первый день - понедельник, ближайший к 1 января.
- В нем 4 января. Следовательно, самые ранние сроки - с 29 декабря по 4 января, с 4 по 10 января.
- У него есть первый рабочий день в нем, то есть за исключением субботы, воскресенья и 1 января.

Часть 2: Расчеты Excel

Этот ответ подразумевает, что даты хранятся в виде строк 6-символов.

Сначала определите год и в какой день недели он начнется.

1) Strip the first four characters from the string.` 
    =left(<cell containing the year+week string>, 4) 
2) Prepend "1/1/" to it. 
    ="1/1/"&left(<cell containing the year+week string>, 4) 
3) Convert this string to an Excel date  
    =datevalue(<the last result>) 
4) Determine the Weekday of the 1st day of that year. 
    =weekday(<the last result>) 
5) Calculate the Excel date of the first Monday. 
    =if((<the last result>-4)<0,<the result of step 3>+8-<the last result>, <the result of step 3>+1-<the last result>) 
6) Work out how many weeks on from that we are: 
    =right(<original 6 char year/week string>,2) 
7) Convert 6) to a number 
    =value(<last result>) 
8) Add that to the Monday of Week 1 
    =<result of step 5>+<result of step 7>*7 
9) Convert this to a month number 
    =month(<last result>) 
10) Convert this to a month name 
    =choose(<last result>,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") 
11) Add the year back on 
    =<lastresult>&" "&<result of 1> 

Это дает номер месяца, который содержит понедельник текущей пронумерованной недели.

Если ячейка A1 содержит «201547 то ячейка B1 должна содержать: =CHOOSE(MONTH(IF((WEEKDAY(DATEVALUE("1/1/"&LEFT(A1,4)))-4)<0,DATEVALUE("1/1/"&LEFT(A1,4))+1-WEEKDAY(DATEVALUE("1/1/"&LEFT(A1,4))),DATEVALUE("1/1/"&LEFT(A1,4))+8-WEEKDAY(DATEVALUE("1/1/"&LEFT(A1,4))))+7*(VALUE(RIGHT(A1,2)))),"January","February","March","April","May","June","July","August","September","October","November","December")&" "&LEFT(A1,4)

Если A1 содержит 201547 B1, то возвращается "ноября 2015".

Дальнейшие соображения: Вы можете захотеть сделать его более sophisicated, так что за месяц, заканчивающийся в понедельник не за неделю, начиная с его окончательным понедельник засчитываться как часть месяца. В более общем плане, эта неделя считается только месяцем, так как в месяце есть три или более дня. Или 3 или более его рабочих дней являются частью месяца.

Как бы то ни было, я бы сортировал с рассчитанным месяцем и годом в качестве первичного ключа и кода YYYYMM как вторичный ключ.

+1

Это для определения результата в Excel? OP заявляет, что они используют службы Reporting Services ... – Jonnus

1

Используя комбинацию ресурсов, обнаруженных в Интернете, вы можете найти необходимую информацию.

Сначала вам нужно найти первый день первой недели года. Это уже определено this answer в

DateAdd("d", 
    (-1) * (CInt(New DateTime(Year(Now), 1, 1).DayOfWeek) + 
    IIf(CInt(New DateTime(Year(Now), 1, 1).DayOfWeek) < DayOfWeek.Monday, 
     7, 
     0) 
    ) + 1, 
    New DateTime(Year(Now), 1, 1)) 

Это должна быть адаптирована к любой год - не только текущий, находя год из строки следующим образом

CInt(Left(Parameters!myDate.Value,4)) 

Теперь, как было отмечено в this resource вы можете использовать DateAdd добавить количество недель в году вы вошли в первый день года

=(DateAdd(DateInterval.WeekOfYear, 
    CInt(Right(Parameters!myDate.Value,2))-1, 
    <<FIRST_DAY_OF_YEAR>>) 

Затем вы хотите получить название месяца месяца этой даты, используя Month и MonthName. Разбивая все это приведет к следующим

=MonthName(Month(DateAdd(DateInterval.WeekOfYear, 
    CInt(Right(Parameters!myDate.Value,2))-1, 
    DateAdd("d", 
     (-1) * (CInt(New DateTime(CInt(Left(Parameters!myDate.Value,4)), 1, 1).DayOfWeek) + 
     IIf(CInt(New DateTime(CInt(Left(Parameters!myDate.Value,4)), 1, 1).DayOfWeek) < DayOfWeek.Monday, 
      7, 
      0) 
     ) + 1, 
     New DateTime(CInt(Left(Parameters!myDate.Value,4)), 1, 1))  
    ))) 

Это позволит получить значение текстового месяца для интервала

Создать новый заполнитель в том же текстовом поле, а затем повторите вышеуказанные действия для нахождения

года
=Year(DateAdd(DateInterval.WeekOfYear, ... 

(Не забудьте удалить последнюю скобку в противном случае вы получите Конец заявления ожидаемой ошибки.)

Это Шоуда дать то, что вам требуется, так

201501 = December 2014 
201547 = November 2015 
201553 = December 2015 
201622 = May 2016 

Позвольте мне знать, если это помогает, или если у вас есть дополнительные вопросы

+0

Это решение также отлично работает! Я определенно использовал бы это как альтернативу MDX-варианту выше. – krynil

Смежные вопросы