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

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: Manrus от 21 октября 2020, 10:18:54

Название: Не правильно срабатывает Concatenate + where
Отправлено: Manrus от 21 октября 2020, 10:18:54
Всем привет, при создание скользящего плана столкнулся с проблемой. Не понимаю  как исправить.
Коротко о задаче:
На входе  таблица со столбцами Сценарий, Дата, Товар, Сумма. Из сценариев надо найти 2 наиболее актуальных  и сформировать скользящий план.
Что я сделал сформировал 2 таблицы в которых находятся 2 наиболее актуальных плана(скрипт во вложение + вид таблиц) Из таблиц видно, что скользящий план будет с 1.03.20 по 1.05.21
акплан.PNG
средплан.PNG
Скользяк.txt
Далее я стал объединять таблицы
скользящийАктуальныйплан:
Load
[Дата] as [Дата],
    [Товар2] as [Товар],
    [Сумма2] as [Сумма]
RESIDENT Актуальныйплан;
Concatenate
скользящийсредплан:
Load
[Дата] as [Дата],
    [Товар1] as [Товар],
    [Сумма1] as [Сумма]
RESIDENT Среднийплан  Where not Exists([Дата]);
И при применение сводной таблице в листе получаю, что теряется первых 3 месяца.
Если не использовать not exist то в сводной таблице получается повторения в пересекающихся датах
kW0riLHOdOw.jpg
Всем заранее спасибо за ответы, бьюсь уже 2 сутки не понимаю, как исправить.
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: govorun от 22 октября 2020, 12:39:15
Я правильно понимаю, что из второй таблицы Вы хотите получить (и присоединить к первой таблице) записи с Датой: март, апрель, май?

Как получается исходная таблица? Что такое "Сценарий"? Почему 3 переменных?
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: Manrus от 22 октября 2020, 08:25:41
Цитата: govorun от 22 октября  2020, 12:39:15  Я правильно понимаю, что из второй таблицы Вы хотите получить (и присоединить к первой таблице) записи с Датой: март, апрель, май?

Как получается исходная таблица? Что такое "Сценарий"? Почему 3 переменных?

Да, вы правильно поняли.
Исходная таблица -это загруженная таблица из xls, в столбцы Сценарий загружены название планов: план1,план2 и т.д.
Переменные формируют календари отдельно для "актуального плана" и "среднего плана".   
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: govorun от 22 октября 2020, 12:38:08
По какому принципу выбирается минимальная и максимальная даты?
По большому счету у Вас все данные находятся в одной таблице. И это хорошо.
Если понять подход отбора минимальной и максимальной даты...
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: Manrus от 22 октября 2020, 12:49:30

Цитата: govorun от 22 октября  2020, 12:38:08  По какому принципу выбирается минимальная и максимальная даты?
По большому счету у Вас все данные находятся в одной таблице. И это хорошо.
Если понять подход отбора минимальной и максимальной даты...
По полю дата находится минимальное и максимальное значение и группируется по сценарием. В итоге получаем таблицу с начальной и конечной датой каждого плана
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: govorun от 22 октября 2020, 08:54:18
Цитата: Manrus от 22 октября  2020, 12:49:30  В итоге получаем таблицу с начальной и конечной датой каждого плана
Зачем группировать? Минимальной и максимальной по всей таблице не достаточно?
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: Manrus от 22 октября 2020, 09:44:29
Цитата: govorun от 22 октября  2020, 08:54:18  Зачем группировать? Минимальной и максимальной по всей таблице не достаточно?
В данном примере есть 3 плана каждый по 12 месяцев, засчет группировки мы находим начало и конец каждого плана
Если бы брали мин и макс по всей таблице мы бы ничего нового не получили, а также имели все те же 3 плана
В принципе я смог решить очень топорным методом, не понимаю как тоже самое сделать через exists
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: govorun от 22 октября 2020, 10:23:47
До сих пор не понятен принцип определения Min и Max даты.
Возможно нужно просто перебрать таблицу используя IF().
Вот примерный вариант решения (для 2-х планов), если захотите - переделаете под себя.
NoConcatenate
TMP_0:
LOAD
MIN(Дата) AS d1,
    MAX(Дата) AS d2
RESIDENT [Исход];

LET vMin = Date(Peek('d1', 0, 'TMP_0'));
LET vMax = Date(Peek('d2', 0, 'TMP_0'));
Drop table TMP_0;

NoConcatenate
TMP_1:
LOAD DISTINCT
Дата
RESIDENT [Исход]
WHERE Дата >= DATE('$(vMin)') AND Дата <= DATE('$(vMax)');   

LEFT JOIN (TMP_1)
LOAD
Дата,
    Товар as Товар_1,
    Сумма as Сумма_1
Resident Исход
where Сценарий = 'AAA'
AND (Дата <= DATE('$(vMax)')) ;

LEFT JOIN (TMP_1)
LOAD
Дата,
    Товар as Товар_2,
    Сумма as Сумма_2
Resident Исход
where Сценарий = 'SSS'
AND (Дата >= DATE('$(vMin)'));

NoConcatenate
TMP_2:
LOAD
Дата,
    IF(ISNULL(Товар_1), Товар_2, Товар_1) AS Товар,
    IF(ISNULL(Сумма_1), Сумма_2, Сумма_1) AS Сумма
Resident TMP_1;   

DROP TABLES TMP_1, Исход;
Теперь про "Where not Exists([Дата])". Я таким условием не пользуюсь и могу ошибаться, но похоже, что проверка осуществляется не по предыдущей загруженной таблице, а по всем ранее загруженным и не удаленным таблицам. Опасная штука...
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: Manrus от 23 октября 2020, 10:58:03
Цитата: govorun от 22 октября  2020, 10:23:47  Теперь про "Where not Exists([Дата])". Я таким условием не пользуюсь и могу ошибаться, но похоже, что проверка осуществляется не по предыдущей загруженной таблице, а по всем ранее загруженным и не удаленным таблицам. Опасная штука...
Спасибо за ваши ответы, проблема и правда оказалась в проверки по всем существующим таблицам, решил проблему сохранением  файлов в отдельные qvd файлы и затем вновь загрузил их и "Where not Exists([Дата])" сработал
Название: Re: Не правильно срабатывает Concatenate + where
Отправлено: govorun от 23 октября 2020, 06:47:27
Удачи...