Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在不重复员工ID的情况下计算表中的姓氏_Sql_Postgresql_Count_Distinct - Fatal编程技术网

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

Sql 如何在不重复员工ID的情况下计算表中的姓氏,sql,postgresql,count,distinct,Sql,Postgresql,Count,Distinct,我有一个包含重复的employee实例的employee表。例如,姓氏Baba可能会使用相同的员工ID显示两次。我必须从表中计算姓氏,但不想将相同的姓氏计算两次 我正在用Postgres写SQL。下面是我从中提取查询的表: CREATE TABLE Employee ( emp_no int NOT NULL, birth_date date NOT NULL, first_name varchar(100) NOT NULL, last_name v

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

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

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

在应用
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;

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

像这样的

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;
看小提琴

或者,如果有必要,检查是否有更多数据在两行中重复,执行如下操作

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
看到小提琴了吗


您希望从表中计算姓氏,但不要将同一姓氏计算两次。 所以试试这个:

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

谢谢大家的快速回复。他们都很好,很有帮助

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

选择Employee.emp\u no,COUNT(Employee.emp\u no)作为“员工ID计数” 来自员工 按员工分组。emp_编号 按“员工ID计数”ASC订购


再次感谢大家

我不清楚你想要实现什么。请添加几行样本数据,以及预期的结果。为什么您“确定它会不止一次地计算一些姓氏”?谢谢,我不确定它会两次计算同一个人。我假设这是因为我要求对姓氏进行计数,一个人可能会出现多次(姓名),但只有一个员工ID。因此,我不希望该人的姓氏被计数多次。首先,您的描述与表定义不匹配,您提到了员工ID,但该列不存在。我假设这是一个拼写错误,你的意思是emp_no。在这种情况下,你描述的情况是“一个人可能出现多次(以名字),但只有一次”emp_no不可能发生。这需要在两行中使用相同的emp_no,这是不可能的,因为emp_no被定义为PK,因此在表中是唯一的。您需要查看其他列以确定个人是否重复;例如名字和出生日期。
emp\u no
不是重复的情况,而是
last\u name
。感谢您的回复,初始查询中的“分组人”需要完美地处理,并返回了一个新号码,问题是一些员工的名字和姓氏相同,但员工号码不同。换句话说,他们是同名的不同的人。非常感谢您的回复。@Cmac在我回答的第二个查询中,您可以添加检测重复注册表所需的所有列谢谢,这为每个姓氏返回了一个列。谢谢,这给了我总数1638是,没有重复项