Не правильно срабатывает Concatenate + where

Автор Manrus, 21 октября 2020, 10:18:54

« назад - далее »

Manrus

Всем привет, при создание скользящего плана столкнулся с проблемой. Не понимаю  как исправить.
Коротко о задаче:
На входе  таблица со столбцами Сценарий, Дата, Товар, Сумма. Из сценариев надо найти 2 наиболее актуальных  и сформировать скользящий план.
Что я сделал сформировал 2 таблицы в которых находятся 2 наиболее актуальных плана(скрипт во вложение + вид таблиц) Из таблиц видно, что скользящий план будет с 1.03.20 по 1.05.21
Вы не можете просматривать это вложение.
Вы не можете просматривать это вложение.
Вы не можете просматривать это вложение.
Далее я стал объединять таблицы
скользящийАктуальныйплан:
Load
[Дата] as [Дата],
    [Товар2] as [Товар],
    [Сумма2] as [Сумма]
RESIDENT Актуальныйплан;
Concatenate
скользящийсредплан:
Load
[Дата] as [Дата],
    [Товар1] as [Товар],
    [Сумма1] as [Сумма]
RESIDENT Среднийплан  Where not Exists([Дата]);
И при применение сводной таблице в листе получаю, что теряется первых 3 месяца.
Если не использовать not exist то в сводной таблице получается повторения в пересекающихся датах
Вы не можете просматривать это вложение.
Всем заранее спасибо за ответы, бьюсь уже 2 сутки не понимаю, как исправить.

govorun

Я правильно понимаю, что из второй таблицы Вы хотите получить (и присоединить к первой таблице) записи с Датой: март, апрель, май?

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

Manrus

Цитата: govorun от 22 октября  2020, 12:39:15  Я правильно понимаю, что из второй таблицы Вы хотите получить (и присоединить к первой таблице) записи с Датой: март, апрель, май?

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

Да, вы правильно поняли.
Исходная таблица -это загруженная таблица из xls, в столбцы Сценарий загружены название планов: план1,план2 и т.д.
Переменные формируют календари отдельно для "актуального плана" и "среднего плана".   

govorun

По какому принципу выбирается минимальная и максимальная даты?
По большому счету у Вас все данные находятся в одной таблице. И это хорошо.
Если понять подход отбора минимальной и максимальной даты...

Manrus

#4

Цитата: govorun от 22 октября  2020, 12:38:08  По какому принципу выбирается минимальная и максимальная даты?
По большому счету у Вас все данные находятся в одной таблице. И это хорошо.
Если понять подход отбора минимальной и максимальной даты...
По полю дата находится минимальное и максимальное значение и группируется по сценарием. В итоге получаем таблицу с начальной и конечной датой каждого плана

govorun

Цитата: Manrus от 22 октября  2020, 12:49:30  В итоге получаем таблицу с начальной и конечной датой каждого плана
Зачем группировать? Минимальной и максимальной по всей таблице не достаточно?

Manrus

#6
Цитата: govorun от 22 октября  2020, 08:54:18  Зачем группировать? Минимальной и максимальной по всей таблице не достаточно?
В данном примере есть 3 плана каждый по 12 месяцев, засчет группировки мы находим начало и конец каждого плана
Если бы брали мин и макс по всей таблице мы бы ничего нового не получили, а также имели все те же 3 плана
В принципе я смог решить очень топорным методом, не понимаю как тоже самое сделать через exists

govorun

До сих пор не понятен принцип определения 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([Дата])". Я таким условием не пользуюсь и могу ошибаться, но похоже, что проверка осуществляется не по предыдущей загруженной таблице, а по всем ранее загруженным и не удаленным таблицам. Опасная штука...

Manrus

Цитата: govorun от 22 октября  2020, 10:23:47  Теперь про "Where not Exists([Дата])". Я таким условием не пользуюсь и могу ошибаться, но похоже, что проверка осуществляется не по предыдущей загруженной таблице, а по всем ранее загруженным и не удаленным таблицам. Опасная штука...
Спасибо за ваши ответы, проблема и правда оказалась в проверки по всем существующим таблицам, решил проблему сохранением  файлов в отдельные qvd файлы и затем вновь загрузил их и "Where not Exists([Дата])" сработал

govorun


Яндекс.Метрика