Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Объеденение таблиц

Коллеги, столкнулся с такой задачей - нужно посчитать товар без остатка за период.

выгрузку данных сделали таким образом:

Две таблицы, в одной вся активная номенклатура, во второй только номенклатура, которая на остатках.

Первая таблица

КодМагазинБренд

Вторая таблица

КодМагазинДатаОстатка

Соответственно, что бы мне получить список номенклатур без остатка, я через left join по ключу (Код+ магазин) создаю 3ю таблицу и в ней только данные, где дата остатка не указана, т.е. вся номенклатура без остатка (что мне и нужно).

Но мне то надо построить отчет за период и я никак не соображу, каким образом написать скрип, что бы на каждую дату из второй таблицы в итоговой появилась нужная мне дата.

Может кто подскажет?

1 Solution

Accepted Solutions
Not applicable
Author

Добрый день.

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

Как вариант, попробуй сделать вот так:

Nomenclature:

LOAD * Inline [

NN,        NAME_ID,    NAME

1,        1001,        Milk

2,        1002,        Bread

3,        1003,        Tea

4,        1004,        Coffee

5,        1005,        Meat

6,        1006,        Egg

7,        1007,        Butter

8,        1008,        Water

9,        1009,        Vodka

10,        1010,        Whiskey

];

STORE * from Nomenclature into Nomenclature.qvd (qvd);

DROP Table Nomenclature;

Sale:

LOAD * Inline [

DATE,            NAME_ID

01.01.2016,        1001

01.01.2016,        1002

01.01.2016,        1003

01.01.2016,        1004

02.01.2016,        1001

02.01.2016,        1009

03.01.2016,        1007

03.01.2016,        1008

03.01.2016,        1009

03.01.2016,        1010

04.01.2016,        1003

04.01.2016,        1004

04.01.2016,        1005

05.01.2016,        1001

05.01.2016,        1002

05.01.2016,        1003

05.01.2016,        1004

05.01.2016,        1005

05.01.2016,        1006

05.01.2016,        1007

05.01.2016,        1008

06.01.2016,        1008

];

STORE * from Sale into Sale.qvd (qvd);

//DROP Table Sale;

Date:

LOAD Distinct DATE

Resident Sale

//FROM Sale.qvd (qvd)

Order By DATE;

NoConcatenate

Date_01:

LOAD Concat (num(DATE), ', ') as DATE_01

Resident Date

Order By DATE;

DROP Table Date;

DROP Table Sale;

LET v_ListDate = FieldValue ('DATE_01', 1);

DROP Table Date_01;

FOR Each i_01 in $(v_ListDate)

Result:

LOAD DATE,

    NAME_ID

FROM Sale.qvd (qvd)

Where DATE = $(i_01);

Result_01:

LOAD Date($(i_01), 'DD.MM.YYYY') as DATE_01,

    NAME_ID as NAME_ID_01,

    NAME as NAME_01

FROM Nomenclature.qvd (qvd)

Where not Exists (NAME_ID);

DROP Table Result;

NEXT i_01

View solution in original post

8 Replies
Eugeny_Ilyin
Creator II
Creator II

Привет.

Пример с цифрами был бы весьма кстати.Пока не очень понятна задача. Какая дата нужна в итоговой?

asgardd2
Creator III
Creator III

Полагаю, Вам нужно присоединить календарь (искусственно созданный) к второй таблице, если делать этим спопобом. Т.е. чтобы в второй таблице были все возможные(по первой таблице) соотношения Код-Магазин + Дата. Другими словами добавить строки с нулевым остатком.

Скрипт календаря можно использовать,например, такой:

 

let vStartDate = 39432; //
let vPeriod = num(Today()) - $(vStartDate) ; // период календаря

calendar:
LOAD $(vStartDate) + RowNo() as Дата
AutoGenerate ($(vPeriod));

 

 

Anonymous
Not applicable
Author

Нужна дата остатка.

Для примера в первой таблице 40000 записей, во второй 3000 за один день. значит в 3й должно быть 37000.

а теперь берем остатки за 2 дня.

в первой таблице 40000. во второй на один день 3000, на другой день 5000, итого в 3й должно быть 72000 записей, из них на первый день 37000 и на второй день 35000. вот мне хочется понять, как записать дату остатка.

Я тут подумал, надо использовать календарь - сначала обеденить его с первой таблицей, а потом с таблицей остатков добавив в ключ дату... сейчас пробую этот вариант..ищу как его написать, наверное через Concatenate?

Anonymous
Not applicable
Author

Именно об этом и подумал, сейчас как раз пробую

Anonymous
Not applicable
Author

Все это хорошо, я так и думал сделать, вот только как таблицы объединить?

Сейчас есть одна таблица и там 30000 записей и календарь, например на 5 дней.

и должна получиться 3я таблица, где на каждый день 30000 записей, т.е. в данном случае 150000.

Not applicable
Author

Через JOIN. Если нет пересекающихся полей, то он просто перемножит таблицы

Календарь

---------------

1

2

3

4

5

JOIN

Магазин

------------

Магазин1

Магазин2

Получится

Календарь, Магазин

----------------------------------

1, Магазин1

1, Магазин2

2, Магазин1

2, Магазин2

3, Магазин1

3, Магазин2

4, Магазин1

4, Магазин2

5, Магазин1

5, Магазин2

Not applicable
Author

JOIN либо IntervalMatch()

Not applicable
Author

Добрый день.

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

Как вариант, попробуй сделать вот так:

Nomenclature:

LOAD * Inline [

NN,        NAME_ID,    NAME

1,        1001,        Milk

2,        1002,        Bread

3,        1003,        Tea

4,        1004,        Coffee

5,        1005,        Meat

6,        1006,        Egg

7,        1007,        Butter

8,        1008,        Water

9,        1009,        Vodka

10,        1010,        Whiskey

];

STORE * from Nomenclature into Nomenclature.qvd (qvd);

DROP Table Nomenclature;

Sale:

LOAD * Inline [

DATE,            NAME_ID

01.01.2016,        1001

01.01.2016,        1002

01.01.2016,        1003

01.01.2016,        1004

02.01.2016,        1001

02.01.2016,        1009

03.01.2016,        1007

03.01.2016,        1008

03.01.2016,        1009

03.01.2016,        1010

04.01.2016,        1003

04.01.2016,        1004

04.01.2016,        1005

05.01.2016,        1001

05.01.2016,        1002

05.01.2016,        1003

05.01.2016,        1004

05.01.2016,        1005

05.01.2016,        1006

05.01.2016,        1007

05.01.2016,        1008

06.01.2016,        1008

];

STORE * from Sale into Sale.qvd (qvd);

//DROP Table Sale;

Date:

LOAD Distinct DATE

Resident Sale

//FROM Sale.qvd (qvd)

Order By DATE;

NoConcatenate

Date_01:

LOAD Concat (num(DATE), ', ') as DATE_01

Resident Date

Order By DATE;

DROP Table Date;

DROP Table Sale;

LET v_ListDate = FieldValue ('DATE_01', 1);

DROP Table Date_01;

FOR Each i_01 in $(v_ListDate)

Result:

LOAD DATE,

    NAME_ID

FROM Sale.qvd (qvd)

Where DATE = $(i_01);

Result_01:

LOAD Date($(i_01), 'DD.MM.YYYY') as DATE_01,

    NAME_ID as NAME_ID_01,

    NAME as NAME_01

FROM Nomenclature.qvd (qvd)

Where not Exists (NAME_ID);

DROP Table Result;

NEXT i_01