Страницы: 1
RSS
Дублирование данных при объединении запросов в Power Query
 
Здравствуйте!

Есть две исходные таблицы:
1. Данные по документам, ценам, стоимости и номенклатуре приобретаемых товаров.
2. Данные по датам оплаты этих товаров (банковские выписки).

Обе таблицы загружены в Power Query.
При объединении этих двух запросов, в случае оплаты одного счета два (или более) раз, суммы по каждой банковской выписке дублируются.

Подскажите, пожалуйста, как этого избежать.
 
bandos-2, либо добавить поле Банк номер к таблице с накладными, и использовать его как одно из ключевых, либо убирать дубликаты по номеру счета из таблицы Банк перед слиянием, раз оно все равно не используется.
Вот горшок пустой, он предмет простой...
 
PooHkrd, Добавить поле "БанкНомер" невозможно, т.к. смысл в том, чтобы "подвязать" выписки и счета (исходные данные таблиц генерируются отдельно), а если убрать дубликаты - останутся данные только по одному платежу, остальные "уйдут" с дубликатами.  
 
bandos-2, Присоединяемая таблица должна быть уникальной, в ней не должно быть совпадений. В Вашем случае в таблице Банк номер счета дублируется. Поэтому происходит задвоение строк, сам с этим намаялся. Бывают и менее явные варианты, в Вашем  файле это видно сразу, но случается иначе, и приходится подумать.
Поэтому для себя решил, что:
Во первых нужно привести данные к единому стандарту. Т.е. убрать все лишние пробелы, все слова начать с маленькой буквы, а,
Во вторых обеспечить в присоединяемой таблице (в Вашем случае Банк) уникальные записи, удостовериться в том, что совпадений нет.
Только тогда объединение будет корректным.
Третьим пунктом, возможно излишним, но я делаю так в ответственных местах, я бы назвал создание индекса до объединения, и удаление повторов по индексному полю после этого. После чего и удаление самого индексного поля.
Удачи.
Изменено: lostandleft - 25.03.2020 16:27:55
 
lostandleft, Спасибо, попробую. Предполагаю, что можно решить вопрос вставкой функции по условию (если значений > 2, то ...), но не знаю как это реализовать.
 
Цитата
bandos-2 написал:
останутся данные только по одному платежу, остальные "уйдут" с дубликатами.  
Что у вас куда уйдет? Не понимаю.
Вы вяжете по номеру счета и дате, и хотите получить номер банка, а если совпадает номер счета и дата, то что? Как PQ определит банк, вот и задваивает. Он же не может выбрать наугад и предлагает все что нашел. Таким образом у вас не полные исходные данные для получения корректного результата. Если есть какая-то еще информация по которой можно связать платежи с банком - показывайте, если нет, то на нет и суда нет.
Вот горшок пустой, он предмет простой...
 
Цитата
bandos-2 написал:
случае оплаты одного счета два (или более) раз
нормальная история же. При банковской выписке, кроме номера, еще же есть сумма оплаты? Надо группировать после присоединения: группировку по всем полям, которые не хотите терять, а агрегирование: по сумме оплаты - сумму; по датам, номерам платежек - мин/макс/счёт/иное.
 
genosser, Спасибо. Учитывая, что данные выгружаются из старой 1С7.7 попробую вывести и связать все и через сумму платежа по конкретному счету (хотя ранее этого не планировал). Попробую и отпишусь)))
 
До время суток
Коллеги, я похоже один тут бестолковый. Так и не нашёл, что должно получиться. Может кто разъяснит, что необходимо получить?
 
Андрей VG, в виде картинки. Внизу желаемый результат (без задвоения сумм)
Изменено: bandos-2 - 25.03.2020 18:24:21
 
bandos-2, иначе я не вижу смысла в связывании и самой проблеме, т.к. по факту дубликатов у вас нет
 
я чего-то не понимаю. У вас на один номер счета и дату приходится два банковских документа. Из-за того, что в счете две строки, естественно, подтягивается для из банка по две строки для каждой из них. Если у вас суммы должны совпадать, включите их в ключ объединения, но для этого они должны появиться в таблице Банк. Если это по какой-то причине невозможно, можно попробовать перечислять номера банковских документов через запятую.
F1 творит чудеса
 
Любая задолженность может погашаться частями (2 и более раз). В выписке банка обязательно должен быть (и всегда есть) реквизит "Сумма".
Изменено: sokol92 - 25.03.2020 19:15:19
Владимир
 
Автор Ловите, все как  хотелось, именно так, как нарисовано на приложенной картинке, но примите во внимание несколько комментариев.
Все работать будет, однако предупреждаю о:
1 - Выбор между тем какой банковский документ будет подвязан происходит автоматически в зависимости от сортировки данных (От внутренней сортировки производимой функцией). Если на каком-либо из листов данные в сортировке поменяются (по каким-то причинам), то пустым может стать не тот документ, который предполагается по человеческой логике, а станет какой-нибудь другой (тот который попадет под условие сортировки машинной логики), любой документ, который подойдет под условие NestedJoin, но пустыми будут все прочие документы, которые поэтому  дню прошли.
2 - Если изменится структура данных все может работать не так, как предполагается.
3 - Никого не слушайте о том, что задачи неправильные, мне и самому об этом часто говорят местные Метры стараясь поставить на нужное русло, но я дядька упертый р-), решить можно все...другой вопрос в том, нужно ли оно.
Представленная вами задача изначально тоже под попадает категорию "неправильных", в силу того, что данные собраны неправильно, но, как видите решить ее можно.
Опять таки вопрос, есть ли в этом смысл.
Удачи Вам, осваивать все новое очень не просто, но сам борюсь :-)
Изменено: lostandleft - 25.03.2020 19:38:53
 
lostandleft, если решать задачу в этом виде, то у вас слишком много джойнов. Можно несколько проще:
Код
let
    Источник = Table.NestedJoin(Накладные, {"СчетНомер", "СчетДата"}, Банк, {"СчетНомер", "СчетДата"}, "Банк", JoinKind.LeftOuter),
    ДобавляемСтолбец = Table.AddColumn(Источник, "таб", each Table.FromColumns( List.Zip({Record.ToList( _ )}) & Table.ToColumns([Банк][[БанкНомер],[БанкДата]]), Record.FieldNames( _ ) & Table.ColumnNames( [Банк][[БанкНомер],[БанкДата]] ) ) ),
    Собираем = Table.RemoveColumns( Table.Combine( ДобавляемСтолбец[таб] ), {"Индекс", "Банк"} )
in
    Собираем
Вот горшок пустой, он предмет простой...
 
Спасибо всем, кто принял участие в обсуждении и высказал свои мысли по этому поводу.
Особый респект тем, кто предложил конкретные варианты решения.
Коллективный разум рулит.
 
PooHkrd, List.Zip, а также группу Record я еще не освоил, поэтому использовал то, что есть в арсенале.
 
lostandleft, а вы спрашивайте, не стесняйтесь, можем все решение по косточкам разобрать. Что именно не понятно?
Вот горшок пустой, он предмет простой...
 
PooHkrd, Да вцелом в подходе пока что не вжился в него. Не знакомы ли Вам статьи на русском подобные этой?
https://ssbi-blog.de/blog/technical-topics-english/records-in-power-query-how-when-and-why/
Читать сносно, но все равно не то. Мыслительные усилия тратятся на перевод а не на осмысление материала.
 
Запись это тип данных, который используется во многих языках программирования, и везде это структура, которая содержит именованные поля с разными типами данных.
Рассматривайте запись как строку таблицы, или если вам так понятнее как однострочную таблицу.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх