SQL-запрос для сопоставления похожих клиентов

#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 Это отличный комментарий. Я даю тебе немного репутации.