Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: Student от 22 февраля 2021, 07:19:39

Название: План-Факт
Отправлено: Student от 22 февраля 2021, 07:19:39
Вопрос от новичка, но сломал всю голову.

Есть таблица с фактическим данными продаж в разрезе дней, то в ней есть поле "Дата проводки" для каждого акта.
Есть вторая таблица с плановыми данными, в ней поле - "Дата", которая делит плановые данные по продажам по месяцам.
Обе таблицы связаны через ID Клиента

Задача сделать план-факт, в котором в столбцах будут месяцы/кварталы, в строке "Клиенты"

Для агрегации дней в кварталы добавил "Календарь" и связал его с таблицей фактических данных, то есть факт в разрезе квартала я сформировал.
Но если я добавляю еще одну связь "Календарь"- "Плановые данные",  то создается синтетический ключ и перестаёт работать связь "План"-"Факт" через ID клиента.

Как вообще агрегировать разные таблицы с их локальными датами событий под общую агрегацию "Квартал"?
Необходимо объединить все таблицы в одну, чтобы была только одна связь с Календарем?

Потенциально нужно будет добавить еще таблицу по "ретро-бонусам" в разрезе месяцев, и также учесть их в обшей таблице.
Название: Re: План-Факт
Отправлено: govorun от 23 февраля 2021, 07:50:42
Покажите таблицы
Название: Re: План-Факт
Отправлено: Student от 25 февраля 2021, 07:06:58
Приложил
Название: Re: План-Факт
Отправлено: govorun от 27 февраля 2021, 01:26:30
Для удобства (лично моего) поле "Месяц" во второй таблице (планы) я принял в формате даты (DD.MM.YYYY).
Т.е. будет написано не "январь", а "31.01.2021". Во-первых есть ГОД (это важно), во-вторых для авторов таблицы с планами наверное не составит большого труда вместо "январь" проставить "31.01.2021".
В принципе рекомендую использовать для построения кликовских таблиц конкретную дату, потом меньше гемороя с преобразованиями и подсчетами.
Но это дело личное, как говорится - каждый сам себе художник.
NoConcatenate
ФАКТ:
LOAD
ПРОТОКОЛ AS Ф_ПРОТОКОЛ,
    DATE(ДАТА_ПРОВ) AS Ф_ДАТА_ПРОВ,
    СУММА AS Ф_СУММА,
    ВД AS Ф_ВД,
    КОНТРАГЕНТ AS Ф_КОНТРАГЕНТ,
    ВД & КОНТРАГЕНТ & MONTHNAME(DATE(ДАТА_ПРОВ)) AS PLAN_FLAG
FROM...;

NoConcatenate
ПЛАН:
LOAD
ПРОТОКОЛ AS П_ПРОТОКОЛ,
    DATE(МЕСЯЦ) AS П_МЕСЯЦ,
    СУММА AS П_СУММА,
    ВД AS П_ВД,
    КОНТРАГЕНТ AS П_КОНТРАГЕНТ,
    ВД & КОНТРАГЕНТ & MONTHNAME(DATE(МЕСЯЦ)) AS PLAN_FLAG
FROM...;
Для построения 3-ей и 4-ой таблиц в качестве измерений используйте поля таблицы "План" (факта может и не быть, а если нет плана - то и факт не нужен).
В четвертой таблице в полях месяцев (январь, февраль...) пишем:
SUM(
    IF(SUM(Ф_СУММА) > 0, SUM(Ф_СУММА), SUM(П_СУММА))
   )
Если есть необходимость, таблицу с Фактом можно привязать к календарю.
Вроде должно получится.
Не понял, есть ли прямая связь поля ПРОТОКОЛ с другими полями.