Измените отношение между двумя таблицами на внешнее соединение

У меня есть таблица (table1) с данными фактов. Скажем, (продукты, начало, конец, значение1, месяц [вычисляемый столбец]) - это столбцы, а начальный и конечный столбцы - это временная метка.

Я пытаюсь получить таблицу и гистограмму, которые дают мне сумму value1 за каждый месяц, деленную на число факторов в соответствии с каждым месяцем (этот отчет представляет собой годовую основу. Я имею в виду, что я загружаю данные в qlik sense для одного год).

Я использовал начало и конец, чтобы сгенерировать autoCalendar в качестве поля отметки времени в диспетчере данных qlik sense. Затем я получаю месяц с начала и сохраняю его в вычисляемом столбце «месяц» в таблице1, используя функцию autoCalendar (Month (start.autoCalendar.Month)).

После этого я создал другую таблицу с двумя столбцами (месяц, значение2), столбец значения2 - это значение фактора, которое мне нужно, чтобы разделить значение1 в соответствии с каждым месяцем. это среднее значение (сумма (значение1) / 1520 [для января], сумма (значение2) / 650 [для февраля]) и так далее. Здесь столбцы месяца и месяца являются реляционными столбцами в смысле qlik. тогда я мог бы в своем выражении вычислить сумму (значение1) и получить целевое значение2, которое совместимо с месяцем для таблицы2.

Я смог правильно произвести расчет. но все же упускается одна вещь. Данные продуктов не имеют значения (значение1) за каждый месяц. Например, предположим, что у меня есть товары (p1, p2 ...). У меня есть данные в таблице 1 для (июнь, февраль, ноябрь) и для p2 для (Mrz, Apr, Mai, Dec). Следовательно, когда данные представлены в виде таблицы qlik sense, а также в виде гистограммы, я могу видеть только те месяцы, которые имеют значения в таблице фактов. Таблица qlik sense содержит (2 измерения: [продукты] и [месяц], а мера - m1 [сумма (значение1) / значение2]).

Я хочу иметь годовой отчет за 12 месяцев. и в моем примере я могу видеть для p1 (всего 3 месяца) и для p2 (4 месяца). Когда нет данных, столбец меры [m1] 0, и я хочу, чтобы 0 был в моей таблице и диаграмме.

Я думаю, что это могло бы быть решением, если бы я мог показать данные таблицы смысла qlik как правое внешнее соединение моего отношения отношения (table1.month >> table2.month). Итак, возможно ли в смысле qlik иметь внешнее соединение в таком примере? или есть лучшее решение моей проблемы.


person Ziad Salem    schedule 03.06.2016    source источник


Ответы (2)


Обновить

Понятно. Не уверен, что это лучший подход, но в этом случае я обычно заполняю недостающие записи во время загрузки скрипта.

// Main table
Sales:
Load 
    *,
    ProductId & '-' & Month as Key_Product_Month
;   
Load * Inline [
    ProductId, Month, SalesAmount
    P1       , 1    , 10
    P1       , 2    , 20
    P1       , 3    , 30
    P2       , 1    , 40
    P2       , 2    , 50
];

// Get distinct products and assign 0 as SalesAmount
Products_Temp:
Load 
  distinct ProductId,
  0 as SalesAmount
Resident 
  Sales
;

join (Products_Temp) // Cross join in this case

Load 
  distinct Month
Resident 
  Sales
;

// After the cross join Products_Temp table contains 
// all possible combinations between ProductId and Month 
// and for each combination SalesAmount = 0
Products_Temp_1:
Load 
    *,
    ProductId & '-' & Month as Key_Product_Month1 // Generate the unique id
Resident 
    Products_Temp
;

Drop Table Products_Temp; // we dont need this anymore

Concatenate (Sales)

// Concatenate to main table only the missing ProductId-Month
// combinations that are missing
Load
  *
Resident 
    Products_Temp_1
Where
    Not Exists(Key_Product_Month, Key_Product_Month1)
;

Drop Table Products_Temp_1; // not needed any more
Drop Fields Key_Product_Month1, Key_Product_Month; // not needed any more

Перед сценарием:

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

После сценария:

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


Ссылка на таблицу в Qlik Sense (и Qlikview) больше похожа на полное внешнее соединение. если вы хотите отобразить id только из одной таблицы (а не из всей), вы можете создать дополнительное поле в нужной таблице, а затем выполнять вычисления поверх этого поля вместо связанного. Например:

Table1:
Load
  id,
  value1
From 
  MyQVD1.qvd (qvd)
;

Table2:
Load
  id,
  id as MyRightId
  value2
From 
  MyQVD2.qvd (qvd)
;

В приведенном выше примере обе таблицы будут по-прежнему связаны в поле id, но если вы хотите подсчитать только значения id в правой таблице (Table2), вам просто нужно ввести count( MyRightId )

person Stefan Stoichev    schedule 03.06.2016
comment
Привет, Стефан, На самом деле, мой вопрос о другом. - person Ziad Salem; 03.06.2016
comment
Вы можете объяснить это поподробнее? Вы можете добавить пример? - person Stefan Stoichev; 03.06.2016
comment
Извините, я по ошибке нажал кнопку (Enter), прежде чем закончить комментарий. Я писал подробности. Я отредактирую вопрос, потому что характер комментария ограничен. Я не мог опубликовать детали в комментарии. - person Ziad Salem; 03.06.2016
comment
Стефан, я закончил редактировать вопрос. Теперь вопрос яснее? - person Ziad Salem; 03.06.2016

Я знаю, что на этот вопрос был дан ответ, и мне очень нравится подход Стефана, но надеюсь, что мой ответ поможет другим пользователям. Я недавно столкнулся с чем-то похожим, и я использовал немного другую логику со следующим скриптом:

// Main table
Sales:

Load * Inline [
    ProductId, Month, SalesAmount
    P1       , 1    , 10
    P1       , 2    , 20
    P1       , 3    , 30
    P2       , 1    , 40
    P2       , 2    , 50
];

Cartesian:
//Create a combination of all ProductId and Month and then load the existing data into this table
NoConcatenate Load distinct ProductId Resident Sales;

Join

Load Distinct Month Resident Sales;

Join Load ProductId, Month, SalesAmount Resident Sales; //Existing data loaded

Drop Table Sales;

Это приводит к следующей выходной таблице:

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

Значение Null в новой (самой нижней) строке может оставаться таким, но если вы предпочитаете его заменить, используйте Map..Using процесс

person Qlik eats data    schedule 14.01.2018