Есть ли способ вернуть значение из поля в SQL / Access только при наличии максимального значения? - PullRequest
2 голосов
/ 08 июля 2019

Пересмотр вопроса с целью избежать дальнейшего снижения репутации - извините за новость!

Я работаю над реляционной базой данных MS-Access, которую я создал на работе. Я самоучка, поэтому я очень ценю помощь!

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что мне необходимо установить для каждой независимой транзакции (RefID) одно имя клиента. К сожалению, системы, которые мы используем, допускают существование нескольких Имен Клиентов в одном RefID. Например (выдержка из таблицы данных AR, которую я использую):

Ref ID      Customer Name   AR

20164444    Liberty         50
20164444    Liberty         75
20164444    Unicorn         100
20164444    Liberty         2500

Как видите, в одном RefID указано несколько имен клиентов. Я крутил свои колеса, пытаясь использовать сумму на поле AR и получая значение Max. К сожалению, каждый раз, когда я пытаюсь вставить его в новую таблицу, приходят имена обоих клиентов. Пример текущего используемого кода:

SELECT AR.Refid, max(AR.collectamount) as MCA
FROM AR
GROUP by AR.RefID

Этот код в настоящее время извлекает все RefIds и MCA или максимальную сумму сбора. Однако, если я попытаюсь ввести Имя клиента из моей таблицы сопоставления:

SELECT AR.Refid, Max(AR.collectamount) AS MCA, [Customer Mapping Table].[Parent Name]
FROM AR INNER JOIN [Customer Mapping Table] ON AR.chkrcvdfrom = [Customer Mapping Table].[Child Name - IE]
GROUP BY AR.Refid, [Customer Mapping Table].[Parent Name];

К сожалению, этот код доводит мои записи до 147 977, и я установил, что у меня должно быть только 145 395 уникальных записей. Это говорит о том, что дубликаты существуют в RefID. Пожалуйста, посмотрите следующий пример транзакции, в которой я обнаружил ошибку:

Ref ID        Customer Name     AR

20161100749   TBC               2517
20161100749   Unicorn           30

В конце концов, мне нужно, чтобы у всех 145 395 RefID было только одно имя клиента. Если есть два клиента, мне нужно Имя клиента с наибольшей активностью AR. Все данные, необходимые для того, чтобы сделать это возможным, находятся в файле данных AR - дамп данных нашей деятельности AR на основе каждого RefID. У меня есть дополнительная таблица, которая называется «Таблица сопоставления клиентов», где я создала отношения «Родитель-ребенок» с некоторыми из наших клиентов. Чтобы любое решение работало, мне нужно будет запросить таблицу AR, получить максимальное значение AR каждого клиента и изолировать каждый RefID только для одного родительского имени из таблицы сопоставления.

Редактировать: попытка минимального воспроизводимого примера

Основным источником моих данных является таблица AR - для целей этого упражнения поля следующие:

Ref ID        Customer Name     CollectAmount    itemdesc

20161100749   TBC               2517             Ocean_Freight
20161100749   Unicorn           30               Insurance_Premium
20161100749   TBC               30               AMS Fee
20161100749   TBC               100              Pre-Pull
20161100749   TBC               225              Trucker Yard Storage
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          125              Handling Charge
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY

Приведенный выше раздел можно скопировать и вставить в виде таблицы в MS-Access с именем «AR» - это будет отражать среду MS-Access, в которой я работаю.

Я взял код Ли и реализовал его следующим образом:

SELECT t1.*
FROM AR AS t1 INNER JOIN 
(select t.refid, max(t.collectamount) as MCA
GROUP by AR.RefID)
As t2 ON (t1.collectamount = t2.mca) AND (t1.refid = t2.refid);

Когда я нажимаю «Выполнить», код ошибки не появляется, но запрос возвращает следующее:

Ref ID        Customer Name     CollectAmount    itemdesc

20161100749   TBC               2517             Ocean_Freight
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY

Конечной целью данных будет то, что каждый из двух предоставленных мною RefID будет представлен в двух уникальных строках только с полями max AR, Customer Name и itemdesc. Я боюсь, что это моя вина, и Филипп был прав, что я не предоставил достаточно информации. Надеюсь, это поможет прояснить вопрос.

1 Ответ

2 голосов
/ 08 июля 2019

Если вы хотите получить информацию, связанную с записью, содержащей максимальное значение CollectAmount, во всех записях с одинаковым RefID, то одним из возможных способов является использование объединений:

select t1.*
from YourTable t1 inner join
(
    select t.refid, max(t.collectamount) as mca
    from YourTable t 
    group by t.refid
) t2
on t1.refid = t2.refid and t1.collectamount = t2.mca

Также можно использовать коррелированный подзапрос:

select t1.* from YourTable t1 where t1.collectamount = 
(select max(t2.collectamount) from YourTable t2 where t1.refid = t2.refid)

Здесь измените каждое вхождение YourTable на имя вашей таблицы.

...