Цикл Qlikview с использованием различных дат из данных

#loops #qlikview #qliksense

Вопрос:

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

Примеры данных:

Дата Продукт Продано
01/01/2020 a 5
01/01/2020 b 12
01/01/2020 z 9
01/01/2020 k 18
06/01/2020 a 18
07/01/2020 b 40
07/01/2020 l 5
07/01/2020 k 9
11/01/2020 m 5

Я ожидаю, что результаты будут такими :

Дата Продукт Продано
01/01/2020 a 5
01/01/2020 b 12
01/01/2020 z 9
01/01/2020 k 18
06/01/2020 a 23
06/01/2020 b 12
06/01/2020 z 9
06/01/2020 k 18
07/01/2020 a 23
07/01/2020 b 52
07/01/2020 z 9
07/01/2020 k 27
07/01/2020 l 5
11/01/2020 a 23
11/01/2020 b 52
11/01/2020 z 9
11/01/2020 k 27
11/01/2020 l 5
11/01/2020 m 5

Ответ №1:

Ознакомьтесь с аннотированным сценарием, но общие шаги таковы:

  • создайте временную таблицу, в которой будет указана min дата для каждого продукта (она же дата первой продажи).

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

  • еще одна таблица, содержащая все возможные комбинации между датами и продуктами

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

  • соедините обе временные таблицы обратно в таблицу необработанных данных

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

  • исключите строки, для которых дата продажи меньше или равна минимальной дате продажи ( Where Date >= MinDate ).

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

  • на данный момент у нас есть готовые данные, и мы можем произвести расчет, который даст нам совокупную продажу

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

Аннотированный сценарий:

 RawData:
Load * inline [
Date,       Product, Sold
01/01/2020, a,       5
01/01/2020, b,       12
01/01/2020, z,       9
01/01/2020, k,       18
06/01/2020, a,       18
07/01/2020, b,       40
07/01/2020, l,       5
07/01/2020, k,       9
11/01/2020, m,       5
];

// find the first sale date for each product
MinDates:
Load 
  Date(min(Date), 'DD/MM/YYYY') as MinDate,
  Product
Resident
  RawData
Group By 
  Product
;

// create table with all possible dates and products
TempTable1:
Load Distinct
  Date
Resident 
  RawData
;

join

Load Distinct
  Product
Resident 
  RawData
;

// join both temp tables to the main data table
// and drop the temp tables
join (RawData)

Load * Resident TempTable1;

Drop Table TempTable1;

join (RawData)

Load * Resident MinDates;

Drop Table MinDates;

// filter out records for which the sale date is 
// less than or equal of the first sale date
NoConcatenate

RawData1:
Load 
  * 
Resident 
  RawData
Where
  Date >= MinDate 
;

Drop Table RawData;

// once we have the data in the right format we can calculate aggregated sale amount
// for each record:
//   * if the current Product value is not equal to the previous one - get the Sold amount
//   * else if Sold amount is not null - get the current Sold amound and add the previous AggregatedSale amount
//   * else get the previous AggregatedSale amount
NoConcatenate

FinalTalbe:
Load 
  Date,
  Product,
  Sold,
  if(Product <> peek(Product), Sold,
    if(Sold <> null(), Sold   peek(AggregatedSale), peek(AggregatedSale))
  ) as AggregatedSale
Resident
  RawData1
Order By
  Product,
  Date  
;

Drop Table RawData1;