替代GROUP BY来合并单列中的重复值

roc*_*zen 0 sql db2

我正在使用DB2,它显然不允许您在返回多个列时使用GROUP BY子句.我有记录具有ID和名称的重复值,例如:

EmpID  |  -   name  -   |  code  
___________________________________
111111    |    Williams   |   1 
---------------------------------   
111111    |    Williams   |   2   
----------------------------------
111112    |    Davis      |   3   
---------------------------------
111113    |    Gomez      |   1  
----------------------------------
111113    |    Gomez      |   3
----------------------------------
Run Code Online (Sandbox Code Playgroud)

(请原谅我的格式),我需要得到每个员工的单一实例与代码(并不重要代码实例得到每名员工作为一个显示为长略).

通常我可以这样做:

SELECT * FROM employees GROUP BY EmpID;
Run Code Online (Sandbox Code Playgroud)

DB2不允许您出于某种原因这样做.它说"分组不一致." 你可以做:

SELECT EmpID from employees GROUP BY EmpID; 
Run Code Online (Sandbox Code Playgroud)

但如果你引入更多的返回值,那么它会给你错误.

我尝试使用子查询和派生表,但我不知道如何组合它只选择一个代码值并排除具有重复员工值的记录.如果有人有答案或者可以指向另一个解决这个问题的线程,我会非常感激.

Tar*_*ryn 11

在大多数数据库GROUP BY中,SELECT列表中的每个列都不需要聚合函数,这就是收到错误消息的原因.

对于您的情况,如果code返回的值无关紧要,那么您可以使用聚合函数和分组:

SELECT EmpID, name, MIN(code) code
FROM employees 
GROUP BY EmpID, name; 
Run Code Online (Sandbox Code Playgroud)

演示

group by应用于EmpIdand和name,而aggregate函数应用于code列.


请注意,由于这一点EmpID并且name在功能上相互依赖(据我们从您发布的示例和"重复值"注释中可以看到),以下两个查询将返回与上述查询相同的相同结果:

--- GROUP BY EmpID
------------------
SELECT EmpID, MIN(name) name, MIN(code) code
FROM employees 
GROUP BY EmpID; 


--- GROUP BY name
-----------------
SELECT MIN(EmpID) EmpID, name, MIN(code) code
FROM employees 
GROUP BY name;  
Run Code Online (Sandbox Code Playgroud)