#sql #ms-access
#sql #ms-access
Вопрос:
У меня есть 2 таблицы, которые содержат значения для клиентов. Первая таблица содержит имена клиентов, а вторая содержит информацию, относящуюся к клиенту, например транзакции.
Первая таблица выглядит следующим образом
CustomerID Name
1 Joe
2 Jane
Вторая таблица выглядит следующим образом
TransactID CustomerID Reference
1 1 REF123
2 2 REF123
3 1 REF321
Мне нужно иметь возможность идентифицировать все дубликаты в ссылочном столбце, а также клиента, которому он принадлежит, например, Джо, Джейн
Код, который у меня есть на данный момент, выглядит следующим образом
SELECT o.name, COUNT(p.reference) as RefCount
FROM (t_cust as o
INNER JOIN t_custprop as p
ON o.customerid = p.customerid)
GROUP BY o.name, p.reference
HAVING (COUNT(p.reference)>1)
ORDER BY o.name ASC
Поскольку я не знаю возможных значений, которые могут быть дубликатами, приведенный выше код не возвращает имя клиента и ссылку, которая может быть дубликатом.
Комментарии:
1. Не уверен, есть ли у Access
DINSTINCT
инструкция?2. Попробуйте изменить COUNT(p.reference) на COUNT(*), чтобы подсчитать количество строк. Сделайте это как в списке выбора, так и в предложении having.
3. Какой набор результатов вы ожидаете от своего примера? Вы хотите
REF123, Joe
иREF123, Jane
?
Ответ №1:
Группировка по элементу, который вы подсчитываете, всегда приведет к тому, что количество будет равно 1, что исключается вашим предложением having . Это должно сработать:
SELECT o.name, p.reference
FROM t_cust o
INNER JOIN t_custprop p ON o.customerid = p.customerid
WHERE p.reference IN (
SELECT p2.reference
FROM t_custprop p2
GROUP BY p2.reference
HAVING COUNT(p2.customerid) > 1
)
ORDER BY o.name ASC
Комментарии:
1. Спасибо. Я попробовал это и получил сообщение об ошибке
Too few parameters. Expected 2
2. Ничто в этом заявлении не вызывает функции, требующие параметров, за исключением count() . Я попробовал это на своей стороне, используя предоставленные вами тестовые данные, и получил ожидаемые результаты Jane / Joe для REF123. Если есть проблема в дальнейшем, изолируйте ее и задайте новый вопрос.