【发布时间】:2020-03-18 04:50:34
【问题描述】:
我的查询有一列包含少量值,我需要在每个分组结果集的单个字段中显示它们 - 例如如果我有 3 个不同部门的员工,我希望看到类似
EMPID DEPTS SOMENUMBER SOMEOTHERNUMBER
------ ------ ----------- ---------------
0001 ACCOUNTING, CUST SERVICE, CALL CENTER 100 200
问题是当员工有多个重复部门时。我看到很多关于如何为 Oracle 和其他 DMBS 解决这个问题的问题,但没有特定于 DB2。 IBM 自己的文档https://www.ibm.com/support/knowledgecenter/SSFMBX/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r0058709.html 说: - “如果指定了 DISTINCT,则消除重复的字符串表达式值。”,和 - “如果为 LISTAGG 指定了 DISTINCT,则 ORDER BY 规范的排序键必须匹配字符串表达式 (SQLSTATE 42822)。如果隐式转换字符串表达式,则排序键必须显式包含相应的匹配转换规范。” .
举个简单的例子:
with mylist (field1) as
( values 'A','A','B','C','D','A','C'
)
select listagg (distinct field1, ', ')
within group (order by field1)
from mylist;
IBM 页面上的信息表明这应该返回 'A, B, C, D' 但我得到的是 'A. A. A. B, C. C, D'。
我应该能够通过让子查询进行一些初始汇总来解决这个问题 - 例如
SELECT EMPLOYEE, LISTAGG(DEPARTMENT,', '),
SUM(SOMENUMBER) SOMENUMBER, SUM(SOMEOTHERNUMBER) SOMEOTHERNUMBER
from (
SELECT EMPLOYEE, DEPARTMENT, SUM(SOMENUMBER) SOMENUMBER, SUM(SOMEOTHERNUMBER) SOMEOTHERNUMBER
FROM EMPLOYEES GROUP BY EMPLOYEE, DEPARTMENT)
) GROUP BY EMPLOYEE
事实上,我想这就是我要做的,但 IBM 文档确实表明 DISTINCT 应该可以解决问题。我错过了什么?
【问题讨论】:
-
您的 db2 平台、版本和修订包是什么?它可以在 11.1.4.4 上正确运行。 dbfiddle example
-
您使用的是哪个 Db2 版本?我试过你的例子,它返回了预期的结果:dbfiddle.uk/…
-
在 Db2 for IBM i v7.2 上运行良好
标签: duplicates db2 distinct listagg