DB2-具有DISTINCT子句的LISTAGG()-不起作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2-具有DISTINCT子句的LISTAGG()-不起作用?相关的知识,希望对你有一定的参考价值。

我的查询中有一列包含少量值,因此我需要在每个分组结果集的单个字段中显示它们-例如如果我有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规范的排序键必须与string-expression(SQLSTATE 42822)匹配。如果string-expression是隐式转换的,则排序键必须显式包括相应的匹配转换规范。 。

作为一个简单的例子:

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应该做到这一点。我想念什么?

我的查询中有一列包含少量值,因此我需要在每个分组结果集的单个字段中显示它们-例如如果我有3个不同部门的员工,我想...

答案

您尚未指定,但是如果像我一样使用DB2 9.7 LUW,则LISTAGG(DISTINCT ..仍不起作用。您必须通过XML函数来解决它,例如。 g。:

以上是关于DB2-具有DISTINCT子句的LISTAGG()-不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

Oracle Database 19c 中的 LISTAGG DISTINCT

Oracle distinct listagg 与计数

如何从具有子句的 DB2 中获取 count(*) 总数?

涉及 LISTAGG 的 DB2 SQL

您可以在 DB2 SQL 中订购 listagg 返回值吗?