Как считать фамилии в таблице без дублирования идентификатора сотрудника - PullRequest
0 голосов
/ 21 января 2020

У меня есть таблица сотрудников с повторяющимися экземплярами сотрудников. Например, фамилия Баба может появляться 2 раза с одним и тем же идентификатором сотрудника. Я должен посчитать фамилии из таблицы, но не хочу считать одну и ту же дважды.

Я пишу SQL в Postgres. Вот таблица, из которой я рисую свой запрос:

CREATE TABLE Employee (
    emp_no int   NOT NULL,
    birth_date date   NOT NULL,
    first_name varchar(100)   NOT NULL,
    last_name varchar(100)   NOT NULL,
    gender varchar(100)   NOT NULL,
    hire_date date   NOT NULL,
    CONSTRAINT pk_Salaries PRIMARY KEY (
        emp_no
     )
);

Данные были предоставлены и содержали дубликаты. Я не могу удалить дубликаты, но не хочу их считать. Вот мой запрос:

SELECT Employee.last_name, COUNT(Employee.last_name) AS "Last Name Count"
FROM Employee
GROUP BY Employee.last_name
ORDER BY "Last Name Count" DESC;

Вывод работает хорошо, но я уверен, что он подсчитывает некоторые фамилии более одного раза. Я попытался добавить WHERE причину, чтобы получить число фамилий, где emp_no отличается, но это не работает.

Ответы [ 5 ]

1 голос
/ 21 января 2020

Вы хотите посчитать фамилии из таблицы, но не считайте одну и ту же дважды. Так что попробуйте:

"SELECT COUNT(DISTINCT Employee.last_name) AS "Last Name Count" FROM Employee"
0 голосов
/ 21 января 2020

Спасибо всем за ваши быстрые ответы. Все они были очень хорошими и полезными!

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

SELECT Employee.emp_no, COUNT (Employee.emp_no) AS "Количество идентификаторов сотрудников" FROM Employee.emp_no ORDER BY "Количество идентификаторов сотрудников" ASC;

Еще раз спасибо всем очень много!

0 голосов
/ 21 января 2020

Просто используйте ключевое слово distinct при применении агрегации COUNT():

SELECT e.last_name, COUNT(distinct e.last_name) AS "Last Name Count"
  FROM Employee e
 GROUP BY e.last_name
 ORDER BY "Last Name Count" DESC;
0 голосов
/ 21 января 2020

Вы должны попробовать проверить, если имя учитывается уникально по каждой фамилии

как-то так

SELECT Employee.last_name, COUNT(distinct Employee.first_name) AS "Last Name Count"
FROM Employee
GROUP BY Employee.last_name
ORDER BY "Last Name Count" DESC;

см. Скрипку

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f0a9568e6cb5fb5e0247d2f2c5e95114

или при необходимости проверьте, повторяется ли больше данных в обеих строках, выполнив что-то вроде

select distinct * from (
SELECT Employee.last_name, 
COUNT(*) over (partition by first_name, birth_date, last_name, gender) AS n
FROM Employee
) V
where n > 1

см. Скрипту

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=223143f0d603abf30d99ad87fa07781e

0 голосов
/ 21 января 2020

emp_no - это первичный ключ, поэтому он должен быть уникальным, и предложение where с различными значениями не будет иметь никакого влияния. Запрос кажется точным, я был бы удивлен, если бы он учитывал фамилии более одного раза.

...