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

时间:2013-05-17 15:00:29

标签: sql db2

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

EmpID  |  -   name  -   |  code  
___________________________________
111111    |    Williams   |   1 
---------------------------------   
111111    |    Williams   |   2   
----------------------------------
111112    |    Davis      |   3   
---------------------------------
111113    |    Gomez      |   1  
----------------------------------
111113    |    Gomez      |   3
----------------------------------

(请原谅我的格式化)我需要使用代码获得每个员工的单个实例(只要每个员工出现一个代码实例,这并不重要。)

通常我可以这样做:

SELECT * FROM employees GROUP BY EmpID;

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

SELECT EmpID from employees GROUP BY EmpID; 

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

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

1 个答案:

答案 0 :(得分:11)

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

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

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

请参阅Demo

分组依据同时应用于EmpIdname,而汇总功能应用于code列。


请注意,由于EmpIDname在功能上相互依赖(据我们从您发布的示例和"重复值&#34看到) ; 评论),以下两个查询将返回与上述查询相同的相同结果:

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