如何在不重复员工 ID 的情况下计算表中的姓氏

Posted

技术标签:

【中文标题】如何在不重复员工 ID 的情况下计算表中的姓氏【英文标题】:How to count last names in a table without duplicating employee ID 【发布时间】:2020-01-21 15:22:39 【问题描述】:

我有一个员工表,其中包含重复的员工实例。例如,姓 Baba 可能会使用相同的员工 ID 出现 2 次。我必须从表中计算姓氏,但不想将同一个计算两次。

我正在 Postgres 中编写 SQL。这是我从中提取查询的表:

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 不同但不起作用的姓氏计数。

【问题讨论】:

我不清楚你想要实现什么。请添加几行示例数据,以及预期的结果。 你为什么“确定它不止一次计算一些姓氏”? 谢谢,我不确定它是否将同一个人计算了两次。我假设这是因为我要求对姓氏进行计数,并且一个人可能会出现多次(以姓名)但只有一个员工 ID。因此,我不希望那个人的姓氏被计算一次以上。 首先您的描述与表定义不匹配,您提到了员工 ID,但该列不存在。我假设这是一个错字,你的意思是emp_no。在那种情况下,您描述的情况“一个人可能会出现多次(以名义)但只有一次”emp_no 不可能发生。这将需要在两行中使用相同的 emp_no,这是不可能发生的,因为 emp_no 被定义为 PK,因此在表中是唯一的。您需要查看其他列以确定个人是否重复;比如名字和出生日期。 【参考方案1】:

您想计算表格中的姓氏,但不要将同一个名字计算两次。 所以试试这个:

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

【讨论】:

谢谢你,我的总数是 1638 是的,没有重复【参考方案2】:

emp_no 是主键,因此它必须是唯一的,并且带有 distinct 的 where 子句不会产生影响。该查询似乎是准确的,如果它不止一次计算姓氏,我会感到惊讶。

【讨论】:

emp_no 不是重复的情况,而是last_name 感谢您的回复 而初始查询中的“group by”处理得非常好【参考方案3】:

在应用COUNT() 聚合时只需使用distinct 关键字:

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;

【讨论】:

谢谢。每个姓氏都返回一个。【参考方案4】:

您应该尝试验证每个姓氏是否唯一计算名字

类似的东西

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

【讨论】:

这确实返回了一个新号码,问题是一些员工的名字和姓氏相同,但员工号码不同。换句话说,他们是同名的不同人。非常感谢您的回复。 @Cmac 在我的答案的第二个查询中,您可以添加检测重复注册表所需的所有列【参考方案5】:

感谢大家的快速回复。他们都非常好,乐于助人!

我运行以下代码发现我错了,每个人在表中只有一个实例,并且只有一个唯一的员工 ID (emp_no)。

SELECT Employee.emp_no, COUNT(Employee.emp_no) AS "Employee ID Count" 来自员工 GROUP BY Employee.emp_no 按“员工 ID 计数”ASC 排序;

再次感谢大家!

【讨论】:

以上是关于如何在不重复员工 ID 的情况下计算表中的姓氏的主要内容,如果未能解决你的问题,请参考以下文章

如何在不计算第二个表中的双打的情况下建立连接? [复制]

如何在不创建查询的情况下从 Access 表中获取值

如何使用 Java Spring Boot 在不插入新值的情况下更新表中的现有值

如何在没有_id的表中保存文档[重复]

如何在不重复整数的情况下随机创建 ID 列?

SQL-如何在不自动增加 ID 列的情况下插入行?