Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Calculations: Продажи за 7 дней. / 16 сообщений из 16, страница 1 из 1
05.12.2018, 12:06
    #39742753
Anton_F
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Приветствую.

В MS OLAP присутствует измерение [Дата] типа Time, в этом измерении есть иерархия [Г-М-Д], так же есть мера [Продажи]

Есть задача сделать вычисляемое измерение [Продажи 7] по расчету продаж за 7 дней.
Например, если в фильтре измерения [Дата] указать период Ноябрь 2018, то берется последний день из выбранного периода (30.11.2018) и в измерение [Продажи 7] попадают данные по продажам за период с 24.11.2018 по 30.11.2018.

Смотрел в сторону функции Lag(), но правильно написать MDX не выходит.

Нужна помощь.
...
Рейтинг: 0 / 0
05.12.2018, 15:04
    #39742881
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Anton_F,

Убедите заказчика, что ему нужна иерархия по неделям, а не то, что вы привели в качестве примера.
...
Рейтинг: 0 / 0
05.12.2018, 16:25
    #39742948
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Anton_FПриветствую.

В MS OLAP присутствует измерение [Дата] типа Time, в этом измерении есть иерархия [Г-М-Д], так же есть мера [Продажи]

Есть задача сделать вычисляемое измерение [Продажи 7] по расчету продаж за 7 дней.
Например, если в фильтре измерения [Дата] указать период Ноябрь 2018, то берется последний день из выбранного периода (30.11.2018) и в измерение [Продажи 7] попадают данные по продажам за период с 24.11.2018 по 30.11.2018.

Смотрел в сторону функции Lag(), но правильно написать MDX не выходит.

Нужна помощь.

Все правильно LAG. Первое -- у вас измерение Календаря в порядке? Там rigid связи и сортировка дат правильно проставлена?

Если да, то расписываете SCOPE -- на уровне дня SUM(LAG(-6) ... Today) , на других уровнях месяц - год -- смотрите сами есть там смысл какой -- мо;ет сбросить в NULL

Показатель Today рекомендую завести и множество "7 дней" -- дальше дело техники
...
Рейтинг: 0 / 0
05.12.2018, 18:54
    #39743062
Igor.Ko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Реализуйте через вьху где для каждого дня в Вашем календаре будут собраны продажи за последние 7 дней. Используйте оконную функцию SUM ROWS between
https://professorweb.ru/my/sql-server/window-functions/level1/1_2.php


SELECT empid, ordermonth, qty,
SUM(qty) OVER(PARTITION BY empid
ORDER BY ordermonth
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) AS runqty
FROM Sales.EmpOrders;
...
Рейтинг: 0 / 0
05.12.2018, 21:53
    #39743158
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Igor.KoРеализуйте через вьху где для каждого дня в Вашем календаре будут собраны продажи за последние 7 дней. Используйте оконную функцию SUM ROWS between
https://professorweb.ru/my/sql-server/window-functions/level1/1_2.php


SELECT empid, ordermonth, qty,
SUM(qty) OVER(PARTITION BY empid
ORDER BY ordermonth
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) AS runqty
FROM Sales.EmpOrders;

Речь шла об MDX, и о 7 днях, и через ROWS BETWEEN 7 PRECEDING можно написать, но не так как у вас
...
Рейтинг: 0 / 0
06.12.2018, 11:18
    #39743347
Igor.Ko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
a_voronin,
" ROWS BETWEEN 7 PRECEDING" - вы прям разжевали а автору темы в рот положили.

Если автору сложно реализовать через MDX то оконные функции будут более понятной альтернативой.
...
Рейтинг: 0 / 0
06.12.2018, 12:45
    #39743406
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Igor.Koa_voronin,
" ROWS BETWEEN 7 PRECEDING" - вы прям разжевали а автору темы в рот положили.

Если автору сложно реализовать через MDX то оконные функции будут более понятной альтернативой.

Автор разрабатывает куб -- причем тут SQL
...
Рейтинг: 0 / 0
06.12.2018, 13:23
    #39743443
Anton_F
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Сделал вот так:
Код: sql
1.
2.
3.
CREATE MEMBER CURRENTCUBE.[Measures].[Продажи руб за 7 дней]
 AS SUM({[Дата].[Г-М-Д].[День].&[2018-12-04T00:00:00].LAG(7):[Дата].[Г-М-Д].[День].&[2018-12-04T00:00:00]}, [Продажи руб]), 
FORMAT_STRING = "#,#.00"


Работает, продажи выдает правильные.
Подскажите, как исправить этот код, чтобы вместо жестко прописанной даты (&[2018-12-04T00:00:00]) брался ПОСЛЕДНИЙ день в периоде из измерения [Дата]?
...
Рейтинг: 0 / 0
06.12.2018, 14:43
    #39743523
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Anton_FСделал вот так:
Код: sql
1.
2.
3.
CREATE MEMBER CURRENTCUBE.[Measures].[Продажи руб за 7 дней]
 AS SUM({[Дата].[Г-М-Д].[День].&[2018-12-04T00:00:00].LAG(7):[Дата].[Г-М-Д].[День].&[2018-12-04T00:00:00]}, [Продажи руб]), 
FORMAT_STRING = "#,#.00"


Работает, продажи выдает правильные.
Подскажите, как исправить этот код, чтобы вместо жестко прописанной даты (&[2018-12-04T00:00:00]) брался ПОСЛЕДНИЙ день в периоде из измерения [Дата]?


Есть функция NOW() и StrToMemeber

Чего-то такое городите.

Код: sql
1.
2.
3.
Set

 InvoiceDay as STRTOMember('[Invoice Date AR].[Invoice Date AR Hierarchy].[date].&['+ Cstr(Format(Now(),'yyyy'))+']&['+ Cstr(Format(Now(),'yyyy1'))+']&['+ Cstr(Format(Now(),'yyyyMM'))+']&['+ Cstr(Format(Now(),'yyyy-MM-ddT00:00:00'))+'].lag(2)'



Вообще я вам советовал выше объявить такие SET на Today и Last7Days
...
Рейтинг: 0 / 0
06.12.2018, 14:44
    #39743526
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH
 MEMBER [Measures].[x] AS
  (
   StrToMember
   (
      "[Date].[Calendar].[Date].&[" +
      VBAMDX.Format(VBAMDX.Now(),"yyyyMMdd")
      + "]"
   ).lag(2)
   ,[Measures].[Internet Sales Amount]
  )
SELECT
 [Measures].[x] ON COLUMNS
FROM [Adventure Works];
...
Рейтинг: 0 / 0
06.12.2018, 15:52
    #39743610
Anton_F
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
a_voronin, благодарю.
Немного поправил и работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH
 MEMBER [Measures].[x] AS
  (
   StrToMember
   (
      "[Дата].[Г-М-Д].[День].&[" +
      VBAMDX.Format(VBAMDX.Now(),"yyyy")+"-"+ 
      VBAMDX.Format(VBAMDX.Now(),"MM")+"-"+ 
      VBAMDX.Format(VBAMDX.Now(),"dd")
      + "T00:00:00]"
   ).lag(2)
   ,[Продажи руб]
  )
SELECT
 [Measures].[x] ON COLUMNS
FROM [Sales_test];


НО...мне необходимо брать не сегодняшний дату, а последний день из выбранного периода.
...
Рейтинг: 0 / 0
07.12.2018, 10:49
    #39744075
mishgan1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Anton_F,

Продажи на конец выбранного периода:

(TAIL(NonEmpty(EXISTING [Дата].[День].[День],[Продажи руб]),1).item(0),[Продажи руб])

Подойдёт ?
...
Рейтинг: 0 / 0
10.12.2018, 16:35
    #39745468
Anton_F
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
mishgan1Anton_F,

Продажи на конец выбранного периода:

(TAIL(NonEmpty(EXISTING [Дата].[День].[День],[Продажи руб]),1).item(0),[Продажи руб])

Подойдёт ?
Попробовал, не работает.
Сделал так, считает вроде бы правильно:
Код: sql
1.
2.
3.
4.
CREATE MEMBER CURRENTCUBE.[Measures].[Продажи руб за 7 дней]
 AS SUM({[Дата].[Г-М-Д].CurrentMember.lag(6):[Дата].[Г-М-Д].CurrentMember}, [Продажи руб]),
FORMAT_STRING = "#,#.00", 
VISIBLE = 1  ; 
...
Рейтинг: 0 / 0
10.12.2018, 17:41
    #39745513
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Anton_Fmishgan1Anton_F,

Продажи на конец выбранного периода:

(TAIL(NonEmpty(EXISTING [Дата].[День].[День],[Продажи руб]),1).item(0),[Продажи руб])

Подойдёт ?
Попробовал, не работает.
Сделал так, считает вроде бы правильно:
Код: sql
1.
2.
3.
4.
CREATE MEMBER CURRENTCUBE.[Measures].[Продажи руб за 7 дней]
 AS SUM({[Дата].[Г-М-Д].CurrentMember.lag(6):[Дата].[Г-М-Д].CurrentMember}, [Продажи руб]),
FORMAT_STRING = "#,#.00", 
VISIBLE = 1  ; 



Если вам нужно 7 дней от текущего CurrentMember, то это правильно. Если вам нужно от текущего дня (в любом разрезе), то через now() как говорил выше.


Вот это будет напряжно по производительности

Код: sql
1.
TAIL(NonEmpty(EXISTING [Дата].[День].[День],[Продажи руб]),1).item(0),[Продажи руб])
...
Рейтинг: 0 / 0
12.12.2018, 12:58
    #39746612
Anton_F
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Сделал так, считает вроде бы правильно:
Код: sql
1.
2.
3.
4.
CREATE MEMBER CURRENTCUBE.[Measures].[Продажи руб за 7 дней]
 AS SUM({[Дата].[Г-М-Д].CurrentMember.lag(6):[Дата].[Г-М-Д].CurrentMember}, [Продажи руб]),
FORMAT_STRING = "#,#.00", 
VISIBLE = 1  ; 


Но правильно считает только, если раскрыть иерархию [Дата].[Г-М-Д] до уровня [День].
Что надо изменить в скрипте создания измерения, чтобы при сворачивании иерархии до месяца в поле [Продажи руб за 7 дней] выводит сумму за 7 дней (последний день указанного периода - 7 дней), а не как сейчас, выводит сумму за 7 месяцев(см. скриншот).
...
Рейтинг: 0 / 0
12.12.2018, 17:23
    #39746834
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Calculations: Продажи за 7 дней.
Anton_FСделал так, считает вроде бы правильно:
Код: sql
1.
2.
3.
4.
CREATE MEMBER CURRENTCUBE.[Measures].[Продажи руб за 7 дней]
 AS SUM({[Дата].[Г-М-Д].CurrentMember.lag(6):[Дата].[Г-М-Д].CurrentMember}, [Продажи руб]),
FORMAT_STRING = "#,#.00", 
VISIBLE = 1  ; 


Но правильно считает только, если раскрыть иерархию [Дата].[Г-М-Д] до уровня [День].
Что надо изменить в скрипте создания измерения, чтобы при сворачивании иерархии до месяца в поле [Продажи руб за 7 дней] выводит сумму за 7 дней (последний день указанного периода - 7 дней), а не как сейчас, выводит сумму за 7 месяцев(см. скриншот).


Вам надо изучить оператор SCOPE. Такие проблемы разруливаются с помощью него. Нужно для каждого уровня иерархии задать своё выражение.
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Calculations: Продажи за 7 дней. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]