8 Replies Latest reply: Apr 27, 2016 3:37 AM by Vladimir Kochetov RSS

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

    Владислав Коробов

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

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

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

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

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

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

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

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

       

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

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

        • Re: Объеденение таблиц
          Eugeny Ilyin

          Привет.

           

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

            • Re: Объеденение таблиц
              Владислав Коробов

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

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

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

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

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

                • Re: Объеденение таблиц
                  Yuri Novik

                  Через 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

              • Re: Объеденение таблиц
                Anton Aleksandrov

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

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

                 

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

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

                 

                 

                 

                 

                 

                • Re: Объеденение таблиц
                  Vladimir Kochetov

                  Добрый день.

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

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

                   

                  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