SQL-запрос, такой как GROUP BY с условием OR

Попробую описать реальную ситуацию. В нашей компании есть система бронирования со столиком, назовем ее Клиенты , где электронная почта и телефонные контакты сохраняются с каждым входящим заказом - это часть системы, которую я не могу изменить. Я столкнулся с проблемой, как подсчитать уникальных клиентов. Под уникальным клиентом я имею в виду группу людей, у которых один и тот же адрес электронной почты или один и тот же номер телефона.

Пример 1 : Из реальной жизни вы можете представить, что Том и Сандра женаты. . Том, который заказал 4 продукта, заполнил нашу систему бронирования 3 разными адресами электронной почты и 2 разными номерами телефонов, когда один из них делится с Сандрой (в качестве домашнего телефона), поэтому я могу предположить, что они каким-то образом связаны. Сандра, за исключением этого общего номера телефона, заполнила и ее личный, и для обоих заказов она использовала только один адрес электронной почты. Для меня это означает подсчет всех следующих строк как одного уникального клиента . Так что на самом деле этот уникальный заказчик может вырасти в целое семейство.

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0    tom@email.com       +44 111 111    First row
1    tommy@email.com     +44 111 111    Same phone, different e-mail
2    thomas@email.com    +44 111 111    Same phone, different e-mail
3    thomas@email.com    +44 222 222    Same e-mail, different phone
4    sandra@email.com    +44 222 222    Same phone, different e-mail
5    sandra@email.com    +44 333 333    Same e-mail, different phone

Как ypercube сказал, мне, вероятно, понадобится рекурсия для подсчета всех этих уникальных клиентов ].

Пример 2 : Вот пример того, что я хочу сделать.

Можно ли получить количество уникальных клиентов без использования рекурсии, например, с помощью курсора или чего-то еще или нужна ли рекурсия?

ID   E-mail              Phone          Comment
---- ------------------- -------------- ------------------------------
0    linsey@email.com    +44 111 111    ─┐
1    louise@email.com    +44 111 111     ├─ 1. unique customer
2    louise@email.com    +44 222 222    ─┘
---- ------------------- -------------- ------------------------------
3    steven@email.com    +44 333 333    ─┐
4    steven@email.com    +44 444 444     ├─ 2. unique customer
5    sandra@email.com    +44 444 444    ─┘
---- ------------------- -------------- ------------------------------
6    george@email.com    +44 555 555    ─── 3. unique customer
---- ------------------- -------------- ------------------------------
7    xavier@email.com    +44 666 666    ─┐
8    xavier@email.com    +44 777 777     ├─ 4. unique customer
9    xavier@email.com    +44 888 888    ─┘
---- ------------------- -------------- ------------------------------
10   robert@email.com    +44 999 999    ─┐
11   miriam@email.com    +44 999 999     ├─ 5. unique customer
12   sherry@email.com    +44 999 999    ─┘
---- ------------------- -------------- ------------------------------
----------------------------------------------------------------------
Result                                  ∑ = 5 unique customers
----------------------------------------------------------------------

Я пробовал запрос с GROUP BY, но не знаю, как сгруппировать результат по первому или второму столбцу.Я ищу что-нибудь вроде

SELECT COUNT(*) FROM Customers
GROUP BY Email OR Phone

Еще раз спасибо за любые предложения

P.S. Я очень ценю ответы на этот вопрос до полного перефразирования. Теперь ответы здесь могут не соответствовать обновлению, поэтому, пожалуйста, не голосуйте против, если вы собираетесь это сделать (кроме вопроса, конечно:) . Я полностью переписал этот пост.

Спасибо и извините за неправильный старт.

9
задан Community 23 May 2017 в 11:53
поделиться