#sql-server #tsql
Вопрос:
Чтобы упростить задачу, я использую базу данных AdventureWorks для этого примера:
SELECT p.Title
FROM Person.Person p
GROUP BY p.Title
HAVING COUNT(DISTINCT p.LastName) > 1
Я изо всех сил пытаюсь понять , как добавить имя к фамилии DISTINCT
, чтобы количество отличий было основано на обоих этих столбцах, а не только на фамилии. Проблема в том, что я группируюсь по столбцу, отличному от тех, которые указаны в COUNT DISTINCT (p.Title here)
.
Есть какие-нибудь идеи?
Спасибо
Ответ №1:
То, что говорит @GordonLinoff, — это обходной путь, в данном случае он работает, но не обязательно эффективен. Это также не работает, если у вас есть даты или цифры.
Более правильный способ сделать это-сначала сгруппироваться по FirstName
и LastName
также, а затем снова сгруппироваться чуть выше Title
:
SELECT p.Title
FROM (
SELECT DISTINCT p.Title, p.LastName, p.FirstName
FROM Person.Person p
) p
GROUP BY p.Title
HAVING COUNT(*) > 1;
Комментарии:
2. @lptr Правильно, подсчет должен идти снаружи. Исправили
Ответ №2:
Поскольку count(distinct)
в SQL Server не требуется несколько аргументов, обходной путь состоит в том, чтобы объединить их вместе:
HAVING COUNT(DISTINCT CONCAT(p.LastName, ' ', p.FirstName)) > 1
Комментарии:
1. Почему ты не можешь просто
group by p.Title, p.LastName, p.FirstName
тогдаdistinct p.Title