SQL, имеющий количество, отличное от двух столбцов

#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;
 

Комментарии:

1. dbfiddle.uk/…

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