#sql #sql-server #tsql
Вопрос:
Я пытаюсь найти запрос, чтобы сопоставить похожих клиентов.
Чтобы упростить ситуацию, рассмотрим следующий сценарий:
У меня есть таблица, которая содержит имя клиента и купленный продукт. имя клиента может иметь несколько покупок одних и тех же и разных продуктов. Поэтому, во-первых, я могу взять отдельное имя клиента и название продукта, чтобы я видел всех клиентов и все продукты, которые они купили хотя бы один раз.
Теперь я хочу, чтобы запрос показал мне своего рода совпадающих клиентов в соответствии с продуктом, который они оба купили, поэтому я хочу подсчитать аналогичные продукты, которые они приобрели.
Поэтому я хочу видеть для каждой пары клиентов (связывающих все таблицы) количество аналогичного продукта, который они приобрели.
Допустим, исходные данные являются:
CustomerName | ProductName
A | 1
A | 2
A | 1
A | 3
B | 1
B | 2
B | 4
C | 2
Тогда я хочу увидеть результат:
CustomerName1 | CustomerName2 | CountSimilarity
A | B | 2
A | C | 1
B | C | 1
И так далее для всех пар клиентов, у которых есть по крайней мере 1 покупка аналогичного продукта
Есть какие-нибудь предложения, как подойти к этому запросу?
Среда-SQL Server.
Спасибо
Комментарии:
1. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или в другом месте) и почему это не соответствует вашим потребностям.
Ответ №1:
Вот такой подход к самостоятельному соединению:
SELECT t1.CustomerName, t2.CustomerName, COUNT(*) AS CountSimilarity
FROM yourTable t1
INNER JOIN yourTable t2
ON t1.ProductName = t2.ProductName
WHERE
t1.CustomerName < t2.CustomerName
GROUP BY
t1.CustomerName, t2.CustomerName;
Две записи соединяются вместе выше, если их продукты совпадают. Обратите внимание, что неравенство в WHERE
предложении гарантирует, что пары клиентов не будут отображаться в двух экземплярах.
Комментарии:
1. Итак, могу ли я переместить предложение WHERE в начало соединения? И также, похоже, это работает, просто нужно изменить счетчик(*) для подсчета(отличное имя t1.ProductName) 🙂 О! И большое спасибо!!
2. Да, это также сработает, поскольку мы здесь выполняем внутреннее объединение.
3. Я думаю, вам следует задать еще один вопрос. Я ответил на этот вопрос.
4. @BogdanPaul Тим ответил на заданный вопрос. Вы должны ПРИНЯТЬ это. Принятие ответа не только является знаком признательности Тиму за его время и талант, но и указывает другим участникам, что решение было принято.
5. @JohnCappelletti Это отличный комментарий. Я даю тебе немного репутации.