Страницы: 1 2 След.
RSS
Поиск пары в диапазоне
 
Всем привет,
Очень надеюсь на Вашу помощь в решении excel задачи.
Имеется список из 2 колонок:
1) Уникальный номер товара (артикль)
2) Уникальный номер чека
В один чек может входить неограниченное кол-во товаров. Задача найти самые популярные пары (товары которые встречаются в одном чеке чаще всего).

Или может такое в Excele не сделать?
Заранее спасибо за ответ.
 
Цитата
встречаются в одном чеке чаще всего
В одном - или каждом?!. ;)
ps "Правила" - "Приемы" -  "Поиск" - пример (файл).
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Это целая процедура, я когда- то писал цикл, в котором для каждого кода строится сводная(точнее обновляется) - с кодом в фильтре, затем в общий список в дополнительный столбец подтягиваются (можно впром(но долго)) накладные в которых этот товар продавался, потом на основании этого списка обновлялась другая сводная, в которой в фильтр стоял "<>0" на доп.столбце. и сортировка по количеству от я до а
а потом из этой сводной копировались первые 10 товаров в отдельный лист.
длительная процедура - у меня 5000 артикулов просчитывало примерно за 4-6 часов, в зависимости от месяца и количества чеков.
 
Цитата
5000 артикулов просчитывало примерно за 4-6 часов
Нужно что-то менять :-)
 
Возможно, если есть мысли как, я внимательно слушаю  :)  
Сам не в восторге, но как ускорить этот процесс не знаю.
ЗЫ забыл сказать, у меня еще удалялись товары одной группы(если угодно линейки), например заранее понятно, что сверла 5мм по металлу покупают с 6мм .... а нужно было определить именно из других групп.
 
Есть подозрение, что Вы работаете с листом. Попробуйте забрать данные в массив и обрабатывать там.
 
Как то так, если через SQL и ещё одно место, только в другой раз файл прикладывайте
 
Цитата
Есть подозрение, что Вы работаете с листом. Попробуйте забрать данные в массив и обрабатывать там.
Я написал выше как делал, да частично через лист(Сводные таблицы), подтягивал данные через массив. Работа с листом свел насколько мог к минимуму. Правда это было давно  :D  . сейчас бы сделал немного по другому.
anvg, интересный код. Поставил на просчет. На маленьком диапазоне считает быстрее в несколько раз моего, правда на полученных у Вас данных нужно еще построить сводную. Для моей работы - нужно просчитывать 600 - 800 тыс. строк  :)  
А как добавить в код чтобы в выводимых данных был еще столбец сумма? Я сортировал по сумме совместных покупок.
И у меня еще можно удалять товары одной товарной группы. Как это можно сделать у Вас? с sql у меня пока не очень.
в файле два примера - anvg - зеленые ярлыки,
мой - оранжевые.
Изменено: SLAVICK - 24.09.2013 11:49:02
 
anvg, Ваш пример выдал ошибку "Out of memory", через 2,5 часа обработки моих данных.?
Наверно нужно добавить периодическую очистку... 650 тыс строк это не шутки :D
 
SLAVICK
Цитата
Ваш пример выдал ошибку "Out of memory", через 2,5 часа обработки моих данных.?
Специально создал пример на базе 5000 товаров в 160000 чеков - всего строк 800000. Естественно на листе Sales присутствуют только коды товаров и коды чеков, получилось от 17 до 1 единиц товаров на чек. Плюс, вспомогательный лист Articles с кодами товаров, упорядоченные по убыванию количества (в первой строке название Article). Соответственно, запрос поменялся на
Код
Select T1.Article As FMain, T3.Article As FSecond, Count(*) As FRate From
([Articles$] As T1 Inner Join [Sales$] As T2 On (T1.Article=T2.Article))
Inner Join [Sales$] As T3 On (T2.Check=T3.Check)
Where T3.Article<>T1.Article Group By T1.Article, T3.Article
Order By Count(*) Desc, T1.Article, T3.Article

В результате выборка была выполнена без всяких вылетов (подозреваю, что у вас вы использовали названия товаров/чеков вместо их числового эквивалента) за 85 секунд. На таком же количестве строк, но базе товаров 1000 единиц - 47 секунд. Так что дело за правильной организацией данных для анализа  ;)  
Цитата
А как добавить в код чтобы в выводимых данных был еще столбец сумма?
Не совсем понял, как считать эту сумму.
Изменено: anvg - 25.09.2013 03:37:45
 
Ну вот урезанный пример данных.
Коды товаров - числа в формате ??-???(??-???-???), расходные буквенно-цифровые, сумма грн(числовой), Группа товара(текст).
Всего, как писал выше таких документов может быть 100 - 200 тыс. количество строк получается 600-800 тыс.
И не понял :
Цитата
вспомогательный лист Articles с кодами товаров, упорядоченные по убыванию количества (в первой строке название Article).

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

А на счет числового формата Вы ничего не говорили... попробую с числовым эквивалентом.
Остается вопрос о сортировке по сумме совместных продаж (т.е. с другим товаром)и удалению товаров одной товарной группы.Можете попробовать пример из моего поста выше... там заменить 1 в столбце сумма на другие числа.
Если можно урезанный пример Вашего файла... лучше один раз увидеть  :)
Изменено: SLAVICK - 25.09.2013 10:26:55
 
Сумму лучше подтягивать в результат через ВПР, как мне кажется, если составить таблицу код товара, цена. А числа, учитывая, что компьютер - числогрыз, самое быстрое из возможного. Пример прилагаю. По товарной группе - тогда зачем по конкретному товару? Тогда нужно составить таблицу-выборку Код чека, код группы и уже по нему прогонять. Или как предполагается исключение товаров одной товарной группы в чеке? Который первый, последний?
 
Цитата
Сумму лучше подтягивать в результат через ВПР
Через Впр не вариант(мне нужно получить сумму именно совместных покупок(т.е. в одном чеке), а не сумму продаж этого товара всего.) т.к. товар может продаваться совместно реже, но давать больше денег.

Наоборот мне нужно именно исключить все товары этой же товарной группы, а оставить все остальные - это сделано для расширения ассортимента продаж. Т.е. если клиент покупает сверла или кисточки, то он как правило покупает линейками(именно их мне нужно исключить, т.к. и так понятно, что они будут вместе) у меня работа в сегменте B2B поэтому как правило покупают товар линейками.
 
anvg, Ваш пример просчитался за 57 сек. Супер :D ... Остался вопрос по сумме и группам...
 
Цитата
Наоборот мне нужно именно исключить все товары этой же товарной группы, а оставить все остальные
Насколько понял. Пусть есть чек: Шуруп1, Шуруп2, Краска1, Краска2, Доска1, Доска2
Из всех возможных пар необходимо исключить пары: Шуруп1-Шуруп2, Краска1-Краска2, Доска1-Доска2, так как каждый продукт в паре принадлежит одной группе. Нужны только, например, Шуруп1-Краска1, Шуруп1-Краска2, Шуруп1-Доска1 и т. д. Если так, то решаемо, надо несколько заменить запрос SQL.
Цитата
Через Впр не вариант(мне нужно получить сумму именно совместных покупок(т.е. в одном чеке), а не сумму продаж этого товара всего.) т.к. товар может продаваться совместно реже, но давать больше денег.
Честно говоря, всё равно не понял (область деятельности лежит в областях, начинающихся с приставки гео). Или цена одного и того же товара от чека к чеку меняется? Иначе же, ВПР(Товар1;..) + ВПР(Товар2;...). Или интересует относительная стоимость пары по отношению к цене других товаров в чеке?
 
Так точно  :D  
Цитата
Нужны только, например, Шуруп1-Краска1, Шуруп1-Краска2, Шуруп1-Доска1 и т. д.
именно так.
Цена здесь не причем, это сумма, на которую был приобретен товар в этом чеке.(можно же купить одной позиции на 100грн а можно и на 25000грн) сумма рассчитана = к-во шт*цену * скидку клиенту. понятно, что одной товарной позиции можно купить зараз 10шт, можно 200... как SKU она посчитается и там и там = 1, а как сумма, совсем по другому.
например
чек1 товар1=10грн ;товар2 = 20грн ;товар3 = 5000грн
чек2 товар1=20грн ;товар2 = 5000грн ;товар3 = 5000грн
чек3 товар1=30грн ;товар2 = 50грн
В итоге товар1 был продан на 60грн, товар2 на 5070грн товар3 на 10000грн только в этих чеках.
Отдельно друг от друга они тоже продаются.
Так вот по Вашему методу у меня на первое место с товаром 1 станет товар2, а по суме товар3.
Объяснил как мог.... попробуйте в файле из поста8 поменять суммы и группы, все станет понятней.
Изменено: SLAVICK - 25.09.2013 14:43:38
 
Сделал, теперь, правда обсчитывает на генерируемом тестовом примере 160 секунд. Изменения
Ранее из пар Товар1-Товар2,Товар2-Товар1 выводилась только первая, так как количество таких пар в чеках одинаковое. Теперь выводятся обе пары, так как суммы по чекам для поля "Main" у них, естественно, разное.
Было интересно ;)
 
Завтра положу реальные данные.  На тестовых справился за 256 сек. Спасибо... такой пример и в копилку не жалко... :D
А я вот что подумал, а реально ли сделать еще один столбец, в котором  выводилась бы пометка об одинаковой группе(например "1") , это было бы вообще универсально.... закинул в сводную. Нужно все совпадения не ставим фильтр.нужно удалить товары из одинаковых групп, поставил фильтр. Тогда это будет вообще  бомба.
 
Цитата
Нужно все совпадения не ставим фильтр.нужно удалить товары из одинаковых групп, поставил фильтр. Тогда это будет вообще бомба.
Вариант заменить метод кнопки "Создать отчёт по парам"
Скрытый текст

По предложению k61 (Карен) не могу не процитировать
Цитата
Хороший эпиграф пропадает (А.Барто):
"...
Мы с Тамарой
Ходим парой,
Санитары
Мы с Тамарой.
...."
 
Попробовал Ваш пример с доп. столбцом... он так же удаляет все товары из одной группы, а в доп столбце получаются везде "ложь". А как сделать, чтоб выводились ВСЕ парные групки, а только напротив тех которые из разных групп ставилось "Ложь"?... замучил Вас наверное :D , хотя тему и не я создавал :)
 
Извиняюсь, похоже не ту версию сбросил  :(  
В процессе экспериментов, пришлось отказаться от выборки одним SQL (может чем R_Dmitry поможет, если заглянет) и добавить использование Dictionary, так как Excel не поддерживает индексов для таблиц. Скорость уже правда не ахти - 180 сек - плата за универсальность.
Скрытый текст
Изменено: anvg - 27.09.2013 11:06:39
 
Сам разобрался  :D  
нужно строку
Код
sSQL = sSQL & " Where ((T3.Article<>T1.Article) And (T3.AGroup<>T1.AGroup))"

заменить на
Код
sSQL = sSQL & " Where ((T3.Article<>T1.Article))"

Вы наверное забыли убрать проверку групп  :D  
Забираю макрос себе в копилку  :)  и автору этой темы советую.
Осталось сделать макрос кодировки и раскодировки, но это уже мелочи  :)  думаю автор темы и сам это сможет сделать  :)  
А себе ставлю в планы изучить детальнее работу с запросами, с ними оказывается лучше  :D
Изменено: SLAVICK - 27.09.2013 11:18:28
 
Цитата
Забираю макрос себе в копилку
Добро. Успехов ;)
 
Ох уж эти обновления страницы...  :o  пока писал ответ Вы уже ответили  :D
А пока писал этот коммент еще раз  :D
Изменено: SLAVICK - 27.09.2013 11:27:36
 
Тут наткнулся еще на один нюанс. Количество пар из запроса не влазит на лист... их получилось  у меня аж 7 млн....:( понял как закинуть данные из sql запроса в сводную таблицу через recordset... но там получается только 4 поля... а как туда добавить проверку групп ума не приложу.
Думаю лучше из sql запроса данные передать в массив, и в нем обработать,... только не знаю как их туда передать.. :o
 
SLAVICK
Добрый день. Вариант с определением принадлежности пар одной группе в одном запросе пробовал
Скрытый текст
, однако, в Excel поля таблиц нельзя проиндексировать, следовательно поиск значения AGroup в (Select AGroup From [Articles$] Where Article=Main) будет идти простым перебором, поэтому и предложил вариант, использующий Dictionary для отдельно вычисления. Предложенный выше вариант прервал после 30 минут выполнения. И не думаю, что ваши 7 миллионов пар единым запросом можно будет обработать.
Так что в вашем случае, думаю, что следует использовать Access, MySQL, SQLite, MS SQL Express, Oracle Express и т. д.. Задав для таблицы Articles для поля [Article] уникальные индексы.
P. S. в Access этот же SQL запрос при условии требуемой индексации отработал чуть быстрее, чем вариант с DefineRate4.
 
Добрый день, anvg.
На сколько я понял у Вас в предыдущей процедуре данные выгружались с запроса на страницу, а потом в словаре обрабатывались.... именно выгрузку на страницу нужно чем то заменить...
У меня идея заключалась в следующем:
1. получаем данные с sql запроса
2. передаем их в двухмерный массив(вместо страницы)
3. при помощи другого массива "привязываем" к основному массиву еще одно поле (группа1=группа2)
4. обработать данные в массиве и "отдать" в новое подключение... а уже на основании его построить сводную.
вот на последнем пункте споткнулся... не могу передать массив в подключение(или в кэш сводной)

Так или иначе нужно исключить промежуточную выгрузку данных на лист(именно он и ограничивает к-во данных)
оффтоп: а как Вы делаете скрытый текст?
Изменено: SLAVICK - 30.09.2013 16:10:21
 
Боюсь ошибиться, но кажись либо serge007, либо The_Prist, что-то подобное решали. Дам просто ссылки на их сайты:
http://www.excel-vba.ru/forum/index.php?board=3.0
http://www.excelworld.ru/forum/10
P.S. Сдается мне, мы еще одного сводника приобрели :)
Я сам - дурнее всякого примера! ...
 
Спасибо, но там не совсем то... там обсуждалось как добавлять данные в подключение из листа многих книг... а здесь  уже есть готовый массив, и из него просто нужно сделать кэш чтобы построить сводную таблицу.
Может я не ту тему нашел...
http://zakup.vl.ru/forum/viewtopic.php?f=15&t=35&start=240
Я там когда то тоже поучаствовал :D
 
Славик, я же не о том. Просто эти ребята именно со сводными более других работали. Серж, так вообще заслуженный сводник, а Дима специально для меня такой крутой макрос по преобразованию сводных написал! Я и пытаюсь Вас свести с теми, кто в теме(тавтология:)).
Я сам - дурнее всякого примера! ...
Страницы: 1 2 След.
Наверх