Quantcast
Channel: SQL.ru: OLAP и DWH
Viewing all 1167 articles
Browse latest View live

Полуаддитивная мера требует наличия измерения времени

$
0
0
Добрый день.


Есть Measures sum(), работает нормально, добавляю Measures(Last non empty) и вылизает ошибка "Полуаддитивная мера требует наличия измерения времени". Подскажите, как решить проблему?

Поиск решения по ускорению получения среднего значения.

$
0
0
Добрый день!
Имеется некий куб, в котором имеется аналитика по продажам и движениям товара, существует задача получения показателя оборачиваемости.

Есть меры [ДвижКолво] и [ДвижСумма], которая отражает проводки по движению товара (закпуки, перемещения по торговым точкам и складам, продажи итд). Соответственно остаток высчитывают (через вычисление), как:
[ОстатокКолво]: sum(PeriodsToDate([Время].[Дата].[(All)], [Время].[Дата].currentmember), [Measures].[ДвижКолво])
[ОстатокСумма]: sum(PeriodsToDate([Время].[Дата].[(All)], [Время].[Дата].currentmember), [Measures].[ДвижСумма])


Далее смотрим формулу оборачиваемости. Оборот (дн) = Средний товарный запас / Средний объем продаж за выбранный период.

в mdx для вычисления использую простую формулу:
по количеству:
AVG(DESCENDANTS([Время].[Дата].CurrentMember, [Время].[Дата].[День]), [Measures].[ОстатокКолво]) /
AVG(DESCENDANTS([Время].[Дата].CurrentMember, [Время].[Дата].[День]), [Measures].[ПродажиКолво])

в денежном выражении:
AVG(DESCENDANTS([Время].[Дата].CurrentMember, [Время].[Дата].[День]), [Measures].[ОстатокСумма]) /
AVG(DESCENDANTS([Время].[Дата].CurrentMember, [Время].[Дата].[День]), [Measures].[ПродажиСебестоимость])


где [ПродажиКолво] и [ПродажиСебестоимость], соответствующие меры куба.


Проблема заключается в очень долгом построении отчета на основании данных куба при использовании данных вычислений, если сравнивать с другими мерами и вычислениями. Понимаю, что функция avg() может быть очень требовательной к ресурсам, но есть ли подходы, с помощью которых можно увеличить скорость обработки?


+ система
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

Подсчет кол-ва месяцев.

$
0
0
Всем привет. Ребят уже перепробовал многие варианты, но что то неполучается.
Как мне mdx запросом получить кол-во месяцев. Например:
Текущей месяц май-кол-во месяцев предшествующих 5 в т.ч май.
Получается как нарастающий итог, но только по кол-ву дат.

SSAS + Excel поиск по атрибуту очень большого измерения

$
0
0
Доброго дня всем.

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

Измерение в кубе имеет два атрибута из этой таблице. Ключом измерения является значение X, по которому происходит связка с таблицей фактов.

Куб используется посредством Excel, где пользователи хотят в качестве фильтра использовать атрибуты этого измерения.
Поиск по конкретному значения любого из атрибута длится ооочень долго - не менее 10 минут.

Вопрос: как ускорить поиск по значению атрибута?

Индекс по столбцу атрибута маловероятен, так как админ БД не я.

Сумма уникальных значений

$
0
0
Знатоки, прошу помощи, горят сраки сроки.
Нарисовал свой первый куб и столкнулся с проблемой.
Есть размерности дата, отделение, клиент.
Есть мера сумма и кол-во
Проблема в том, что клиент может повторяться много раз за один и тот же день и поэтому когда я считаю сколько он повторяется и рядом вывожу сумму, она суммируется за все повторения.
Как правильно выводить сумму только уникальных значений меры сумм для любой размерности?

Заранее благодарю откликнувшихся.(с большой охотой почитаю что-то сам, если посоветуете)

Datastage mssql refcursor из хранимой процедуры

$
0
0
Согласно документации DS такой изврат для MSSQL поддерживает, но не получается настроить Stored procedure stage
вроде на вкладке Output-column видно маппирование в виде
<процедура>;1.<поле 1>
<процедура>;1.<поле 2>
...
<процедура>;1.<поле N>

как правильно заполнить вкладку parameters?
Parameter Name Maps to Column Parameter maker Parameter type
ReturnValue что тут? ? CursorOutput
dateto что тут? '2018-09-16' Input

процедура имеет один входной параметр

Поиск в иерархии

$
0
0
Здравствуйте.

Есть иерархия:

Картинка с другого сайта.

Из неё нужно получить элемент иерархии (Uniquename) по ID.
Сейчас это делаю так:

WITH
MEMBER [Measures].[Uniquename] AS [Work Item Tree].[Work Item Tree Hierarchy].CurrentMember.Uniquename
SELECT {[Measures].[Uniquename]} ON 0,
FILTER 
( 
	(Descendants([Work Item Tree].[Work Item Tree Hierarchy].[Work Item Tree], [Work Item].[System_Id].&[12345])),
	[Work Item].[System_Id].&[12345]
)
ON 1
FROM [Work Item]


При этом возвращается не искомый, а родительский элемент, в котором он находится.
Как получить искомый?

Вопрос по MDX-запросу.

$
0
0
Здравствуйте!

Есть MDX-запрос
+MDX-запрос
WITH
MEMBER [Цена] AS
	(CASE WHEN [Measures].[Отгрузки шт]<>0 THEN
		[Measures].[Отгрузки сумма без НДС]/[Measures].[Отгрузки шт]
	END)
SELECT
	{[Measures].[Отгрузки шт],
	[Measures].[Отгрузки сумма без НДС],	
	[Цена]}
ON 0,	
	NONEMPTY([Торговые точки].[Код ТТ].[Код ТТ],[Measures].[Отгрузки шт])*
	NONEMPTY([Продукция].[Код продукции].[Код продукции],[Measures].[Отгрузки шт])*	
	[Время].[Дата].[Дата]
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2018-01-01T00:00:00]:[Время].[Месяц].&[2018-05-01T00:00:00],
		[Торговые точки].[Код ТТ].&[00001ГРД1],
		[Продукция].[Код продукции].&[00001]
		) ON 0
	FROM
		PROFIT)

Получаем такой результат по дням
Код ТТКод продукцииДатаОтгрузки штОтгрузки сумма без НДСЦена
Код ТТ1Код продукции101.01.20181100100
Код ТТ1Код продукции102.01.20181100100
Код ТТ1Код продукции103.01.2018nullnullnull
Код ТТ1Код продукции104.01.2018216080
Код ТТ1Код продукции105.01.2018324080
Код ТТ1Код продукции106.01.20181100100
..................

Но тут задачка интересная, которую решаю. Нужно промаркировать строки, где идет снижение цены от базовой цены больше чем на 9%. То есть маркируем акции. Написал MDX-запрос и завис.

+MDX-запрос
WITH
MEMBER [Дельта] AS 0.09
MEMBER [Цена] AS
	(CASE WHEN [Measures].[Отгрузки шт]<>0 THEN
		[Measures].[Отгрузки сумма без НДС]/[Measures].[Отгрузки шт]
	END)
MEMBER [Предыдущая цена] AS //?
	(CASE WHEN [Цена] = NULL THEN
		[Предыдущая цена]
	ELSE
		([Время].[Дата].CurrentMember.PrevMember,[Цена])
	END)
MEMBER [Отклонение] AS
	(CASE WHEN [Предыдущая цена] <> 0 THEN
		[Цена]/[Предыдущая цена] - 1
	END)
MEMBER [Предыдущая маркировка] AS //?
MEMBER [Маркировка] AS //?
	(CASE WHEN [Отклонение] <= - [Дельта] THEN
		'Да'
	WHEN [Отклонение] < [Дельта]  AND [Предыдущая маркировка] = 'Да' THEN
		'Да'
	END)
SELECT
	{[Measures].[Отгрузки шт],
	[Measures].[Отгрузки сумма без НДС],	
	[Цена],
	[Предыдущая цена],
	[Отклонение],
        [Предыдущая маркировка],
        [Маркировка]}
ON 0,	
	NONEMPTY([Торговые точки].[Код ТТ].[Код ТТ],[Measures].[Отгрузки шт])*
	NONEMPTY([Продукция].[Код продукции].[Код продукции],[Measures].[Отгрузки шт])*	
	[Время].[Дата].[Дата]
ON 1
FROM
	(SELECT
		([Время].[Месяц].&[2018-01-01T00:00:00]:[Время].[Месяц].&[2018-05-01T00:00:00],
		[Торговые точки].[Код ТТ].&[00001ГРД1],
		[Продукция].[Код продукции].&[00001]
		) ON 0
	FROM
		PROFIT)

Результат должен быть таким.
Код ТТКод продукцииДатаОтгрузки штОтгрузки сумма без НДСЦенаПредыдущая ценаОтклонениеПредыдущая маркировкаМаркировка
Код ТТ1Код продукции101.01.20181100100nullnullnullnull
Код ТТ1Код продукции102.01.201811001001000nullnull
Код ТТ1Код продукции103.01.2018nullnullnullnullnullnullnull
Код ТТ1Код продукции104.01.2018216080100-0.2nullДа
Код ТТ1Код продукции105.01.2018324080800ДаДа
Код ТТ1Код продукции106.01.20181100100800.25Даnull
..............................

1. Данные выгружены по дням. Есть поле [Предыдущая цена], который вытягивает цены предыдущей строки, то есть цена предыдущего дня. Период в субкубе указан с первого 1 января 2018. Первая строка берется из 31.12.2017 г. или 01.01.2018?

2. Отгрузки бывают не ежедневные, поэтому предыдущая цена должна игнорировать null. То есть из таблицы: для 4-ой строки предыдущая цена берется из второй строки. Как правильно написать MEMBER?

3. Есть MEMBER [Маркировка]. Улавливает снижение цены больше 9% и маркирует. Если повышение цены до 9 % нету, но в предыдущей строке есть маркировка, то продолжает маркировать. В остальном случае не маркирует. Тут формула смотрит на предыдущую маркировку. Также игнорируются строки null. То есть MEMBER [Маркировка] должна посмотреть на текущий MEMBER [Предыдущая маркировка], а MEMBER [Предыдущая маркировка] берет из предыдущей строки с учетом null MEMBER [Маркировка].Как правильно написать MEMBER? Как правильно написать MEMBER [Предыдущая маркировка]?

Пока игнорируем такие случаи:
- в первой строке снижение цены, то есть акция
- двойное снижение цен (которые больше дельты)
- двойное повышение цен (которые больше дельты) после снижения цен
- само повышение цен
- в какой то один день повышение цен от базовой (не акционной) цены.

Aggregations в SSAS

$
0
0
Просьба помочь со следующей проблемой.

Есть OLAP Куб, сделанный в SSAS. В кубе 10 партиций в среднем по 2,5 ГБ (около 28 млн. строк в каждой). Данные в партиции выгружены на конец каждого месяца, соответственно в каждой партиции только одна дата - конец соответствующего месяца.
13 измерений. 13 вычисляемых мер (в разделе Calculations).
NullProcessing для мер выставлен в значение Preseve (кроме одной количественной меры).
Для ускорения работы куба создаю Агрегаты. Делаю пока только для одной партиции, чтобы посмотреть размер. Агрегат всего по двум измерениям (Дата и Подразделение) для одной единственной партиции выходит равным около 4,5Гб. Т.е. больше размера партиции! При том что в Design

Почему такое может быть? И как уменьшить?

В измерении около 36тыс. дат. Но в партиции непосредственно только одна дата используется. Может он для остальных дат, для которых нет значения проставляет 0 и это так влияет на размер?

Ещё не могу понять как интерпретировать отображение рассчитанных агрегатов в режиме Advanced View. Там строки - все измерения, столбцы (A0 и A1) - агрегаты. Но в моём случае, хоть и указано для двух измерений AggregationUsage = Default, а для остальных None, почему-то галочка стоит только одна, в столбце A1 напротив Даты. А в столбце A0 напротив Подразделения никакой галочки нет (хотя свойство AggregationUsage = Default) , и вообще в столбце A0 галочки нет нигде. Что это значит?

Буду благодарен за любую помощь.

Расчет остатков в кубе

$
0
0
Коллеги, помогите, пожалуйста, разобраться с расчетом остатков в OLAP кубе.
Система Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) Jun 17 2016 19:14:09 Enterprise Edition
Клиент Excel 2013.
Делаю прототип OLAP куба для расчета остатков и движений товара.
Таблица фактов:
Дата, Продукт, Склад, Клиент, Движение Товара в упаковках (расход”-“;приход “+”), Начальный остаток, Конечный остаток.
Сумма по движениям товара за период будет положительна или отрицательна, смотря чего было больше прихода или расхода.
Начальный остаток на дату равен сумме приходов и расходов товара в диапазоне от начальной даты в таблице фактов, до даты текущей строки в таблице фактов не включительно.
Конечный остаток на дату равен сумме приходов и расходов товара в диапазоне от начальной даты в таблице фактов, до текущей даты текущей строки в таблице фактов, включительно.
Необходимо считать движение товара, начальный и конечный остаток на любой период.
Сделал SSAS Olap куб с 4мя измерениями: Товар, Клиент, Склад, Время.
И тремя мерами: ДвижениеТовара(SUM), НачальныйОстаток(LastNonEmpty), КонечныйОстаток(LastNonEmpty).
С движением все просто: считает правильно в любых разрезах.
С остатками беда: правильно считает, только если в столбец вывести даты. Местами ошибается, если даты убрать в фильтр и в столбец вытащить месяца. С годами ошибается почти всегда.
Остатки проверяю по формуле: начальный остаток + движение=конечный остаток
Что я делаю не так? Как правильно считать остатки на начало и конец периода в кубе?
Спасибо.

Как просмотреть исходные данные в PowerBI?

$
0
0
Я в том смысле, что когда данные в SQLServere - там понятно, открываю Management Studio и с помощью SQL запросов узнаю, что там где записано. Может, где-то нолик в данных лишний. Или какую-то строчку удалить надо, добавить или узнать конкретное значение в конкретной строке.
В общем, с данными удобно работать в SQLServer, но как их просматривать в PowerBI?

Второе: с помощью SSIS я в DWH могу пополнять данные из разных источников. Могу немного неправильные задать условия и у меня вместо замены старых значений обновлёнными будут создаваться новые строки. Это могу вычислить и лишние строки потереть, а ошибку в SSIS поправить. Как это происходит в PowerBI? Не совсем понимаю...

В кубе не был найден объект уровня

$
0
0
Здравствуйте!

Запускаю MDX-запрос в Microsoft SQL Server Management Studio.
SELECT {[Measures].[Отгрузки шт]} ON 0, {[Торговые точки].[Код ТТ].&[00001грд], [Торговые точки].[Код ТТ].&[00002грд]} ON 1 FROM PROFIT

Возвращает только одну ТТ: 00001грд, а 00002грд - не находит.

Если запускать запрос через excel - умную таблицу с помощью Свойства подключения - Определение - Текст команды, то выдает сообщение:
Query (1,8) При синтаксическом анализе строки [Торговые точки].[Код ТТ].&[00002грд] в кубе не был найден объект уровня "&[00002грд]".

То есть если запускать через студию и не находит какую то торговую точку (ТТ) в кубе, то не выгружает; а выгружает те, которые находит в кубе. А если через умную таблицу и хоть одна ТТ отсутствует в кубе, то ничего не выгружает, даже другие ТТ, которые есть в кубе.

Почему так? Как можно обойти эту проблему?

Эмуляция FIRSTchild в Standard редакции

$
0
0
Коллеги, подскажите пожалуйста.

Руководство хочет сэкономить известную сумму - на разнице между Enterprise и Standart версиями.
Мигрируем с 2008/R2 на 2017.

Способности этой версии всех заинтересованных лиц устраивают (и про SQL и про OLAP)
, кроме нехватки ряда полуаддитивных мер.
Среди тех, что нам нужна , но которую я не понимаю, как эмулировать - FIRSTchild.

Возможно ли ее эмулировать MDX-запросом?
Если да, то подскажите пожалуйста, как именно, или где посмотреть.

Сильно ли просядет производительность?

8 процессорная БД разделить на 3 среды разработки

$
0
0
Добрый день друзья, как поживаете?

В данный момент пробил с другого проекта БД Oracle Enterprise Edition с секционированием)))

Начинаем разработку ХД. есть некоторые моменты, которые я прохожу в первый раз

Ребят как мне распределить эти 8 процессоров на 3 среды (Продуктивная, разработка, тестовая)
Надо разделить по процессорам, или достаточно разделить по схемам подняв БД целиком в 8 ядерном процессоре?

Пожалуйста помогите советом.

MDX калькуляха среднее

$
0
0
Редко тут пишу, т.к. во всем сам разбираюсь, а сегодня встрял на элементарной вещи.

Есть такая калькуляха считает средние отгрузки за год. CurrentMember выбран год.
avg(DESCENDANTS([Дата].[Дата].CurrentMember, [Дата].[Дата].[Месяц]), [Measures].[Отгрузки шт])
по сути считает среднее арифметическое по месяцам в разрезе года.
Но она не совсем верная, т.к. с точки зрения бизнес логики надо считать среднее по закрытый месяц. Т.е. надо использовать что-то вроде LAG или PrevMember, но в DESCENDANTS это не работает в данном разрезе....

Вопрос как сместить период на -1 месяц (на -1 мембер)

OBIEE как сделать правильно? в таблице среза не данных за календарную дату

$
0
0
Добрый день
Имеется витрина в которой в каждой строке , упрощенно
<дата начала действия><дата окончания действия><поле1><поле2>
Что сделал
Сделал на физ. и лог. слое календарь связанный по <дата начала действия>
Вынес поле1, поле2 в отдельные LTS связав их по соответств полям витрины.

Сделал анализ в котором (упрощенно!) необходимо показать кол-во действий которые начинались в определенную дату.
При этом в анализе должен быть фильтр по <поле1> & <поле2>
Понятно что <дата начала действия> за некоторые даты календаря может и не быть.
В итоге в анализе получаю, что если в факт таблице нет данных за календарную дату- то и в таблице среза ее нет.
Но мне они нужны. нужно выводить 0
Что делать и как это сделать правильно?

Факты с детализацией до дня, планы - квартал

$
0
0
Всем доброго времени суток.

Имеется таблица фактов с детализацией до дня.
Есть иерархия год-квартал-месяц-день
Есть измерения: регион, город, менеджер, отделение, продукт и т.д. Иерархий нет, так как со временем они часто меняется.

Есть таблица планов с детализацией до квартала: отделение, продукт, квартал, значение.

Хотят видеть:
Факты: при детализации до дня - текущие данные из фактов + соответствующее значение квартального плана.
При детализации от квартала до года - сумму данных из фактов + сумму планов.

Подскажите примерное направление реализации.

3аработок от 20 000 рублей в день !!! Вам нужен готовый, уже настроенный метод 3аработка?

$
0
0
3аработок от 20 000 рублей в день !!!
Вам нужен готовый, уже настроенный метод 3аработка?
- Без сложных курсов, в которых вы не можете разобраться.
- Без рутинной работы.
- Без обмана и чтобы деньги были достойные.
Именно готовый 3аработок, а не бесполезный курс!
Подробности на сaйте http://q-money.info (q-money.info)

Про Power BI

$
0
0
Здравствуйте!

Экспериментирую с Power BI. Есть MDX-запрос. Выгружаю данные через Power BI.
+MDX-запрос
WITH
MEMBER [Цена] AS (CASE WHEN [Measures].[Отгрузки шт] <> 0 THEN
	[Measures].[Отгрузки сумма без НДС] / [Measures].[Отгрузки шт]
END)
SELECT
{[Measures].[Отгрузки шт],
[Measures].[Отгрузки сумма без НДС], 
[Цена]
}
ON 0,
NON EMPTY
[Торговые точки].[Код ТТ].[Код ТТ]*
[Продукция].[Код продукции].[Код продукции]*
[Время].[Дата].[Дата]
ON 1
FROM
	(SELECT ({[Торговые точки].[Код ТТ].&[00001грд],
			[Торговые точки].[Код ТТ].&[00002грд]},
		[Продукция].[Код продукции].&[00001],
		[Время].[Дата].&[2018-05-01T00:00:00]:[Время].[Дата].&[2018-05-13T00:00:00])
	ON 0 FROM PROFIT)
При выгрузке получаем такие колонки
- [Торговые точки].[Код ТТ].[Код ТТ].[MEMBER_CAPTION]
- [Продукция].[Код продукции].[Код продукции].[MEMBER_CAPTION]
- [Время].[Дата].[Дата].[MEMBER_CAPTION]
- [Measures].[Отгрузки шт]
- [Measures].[Отгрузки сумма без НДС]
- [Measures].[Цена]


А надо такие
- Код ТТ
- Код продукции
- Дата
- Отгрузки шт
- Отгрузки сумма без НДС
- Цена


1. Если в экселе выгружать, то макросом можно изменить названия полей. То как изменить названия полей после каждого обновления в Power BI?

2. В MDX-запросе в субкубе выбраны две ТТ. Как сделать так, чтобы на панеле можно выбирать вручную ТТ (из списка все имеющихся, как в фильтре в сводной таблице) и запускался MDX-запрос с выбранной ТТ? Аналогично с датами.

Data Lake как Staging Area

$
0
0
Сходил тут SQL Saturday в недавнюю..... кажется субботу(!)
Микрософт просто адски пушает Databrick, но речь не об этом.

Местные консалтеры уверены, если вы хотите современное Хранилище - то, где вместо унылых файлов и/или базы под Staging Аrea всем надо срочно внедрить Data Lakи
Что думаете?
Viewing all 1167 articles
Browse latest View live