【问题标题】:DB2 - LISTAGG() with DISTINCT clause - doesn't work?DB2 - 带有 DISTINCT 子句的 LISTAGG() - 不起作用?
【发布时间】: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


【解决方案1】:

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

with mylist (field1) as 
    ( values 'A','A','B','C','D','A','C'
    )
    select XMLCAST(
             XMLQUERY('string-join(distinct-values($x//row), ", ")'
                      PASSING XMLGROUP(field1 ORDER BY field1) AS "x"
           ) AS VARCHAR(200))
        from mylist

【讨论】:

  • 分心并忘记了这个 - 但我刚刚重试了它,我仍然得到 A、A、A、B、C、C、D 的结果。我们在 LInux 服务器上运行“DB2 Client 10.5.11 命令行处理器”。我能够通过执行临时分组步骤来解决它。
猜你喜欢
  • 2017-04-12
  • 2020-03-28
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多