DB2 - LISTAGG () с предложением DISTINCT - не работает? - PullRequest
0 голосов
/ 18 марта 2020

В моем запросе есть столбец с небольшим количеством значений, и мне нужно отобразить их в одном поле для каждого сгруппированного набора результатов - например, если бы у меня был сотрудник в 3 разных отделах, я бы хотел видеть что-то вроде

EMPID          DEPTS                                   SOMENUMBER  SOMEOTHERNUMBER
------         ------                                  ----------- ---------------
0001           ACCOUNTING, CUST SERVICE, CALL CENTER        100           200

Проблема в том, что для сотрудника существует несколько дублирующих отделов. Я вижу множество вопросов о том, как это выяснить для Oracle и других DMBS, но ничего не указывает c для DB2. В собственной документации IBM по адресу https://www.ibm.com/support/knowledgecenter/SSFMBX/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r0058709.html говорится: - «Если указан DISTINCT, дублирующиеся значения строковых выражений удаляются.» И - «Если DISTINCT указан для LISTAGG, ключ сортировки ORDER BY спецификация должна соответствовать строковому выражению (SQLSTATE 42822). Если строковое выражение неявно приведено, ключ сортировки должен явно включать соответствующую соответствующую спецификацию приведения. ".

В качестве упрощенного c примера:

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', но вместо этого я получаю ' AAA 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 должен сделать свое дело. Чего мне не хватает?

1 Ответ

0 голосов
/ 18 марта 2020

Вы не указали, но если вы используете DB2 9.7 LUW, как и я, LISTAGG(DISTINCT .. (пока) не работает. Вы должны обойти это с помощью XML функций, например:

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