sql-запрос транспонирует динамический столбец в строку в sybase или без использования какой-либо функции поворота

Мой вклад в таблицу

id  value
1    23
1    22
1    24
2    55
2    44

мой вывод должен быть

1 23|22|24
2 55|44

Пожалуйста, помогите в предоставлении запроса, который может работать в базе данных sybase.


person vijay    schedule 21.06.2018    source источник
comment
Существует ли максимальное количество значений для идентификатора? Почему вы используете версию Sybase?   -  person Gordon Linoff    schedule 21.06.2018
comment
Вы хотите, чтобы эти значения были в одном столбце или в трех разных столбцах?   -  person a_horse_with_no_name    schedule 21.06.2018
comment
какой продукт Sybase db (ASE? IQ? SQLAnywhere? Преимущество?)? SQLAnywhere/IQ имеет некоторые возможности поворота, недоступные в ASE... поэтому, как минимум, нам нужно знать, какой продукт Sybase (и версию тоже было бы полезно знать)   -  person markp-fuso    schedule 21.06.2018
comment
@Gordon - для идентификатора существует максимальное значение, для одного идентификатора может быть 3 записи, для другого идентификатора может быть 4 записи.   -  person vijay    schedule 21.06.2018
comment
@a horse - значения, идущие в одну строку, разделены каналом, были бы предпочтительнее, иначе значение представляет собой отдельные строки с разными столбцами, что должно быть вариантом обходного пути.   -  person vijay    schedule 21.06.2018
comment
@markp мы используем версию sybase ase 15.7   -  person vijay    schedule 21.06.2018
comment
ASE не поддерживает list(), group_concant() и FOR XML/PATH, поэтому вам нужно будет использовать циклическую конструкцию, например, создать определяемую пользователем функцию, которая просматривает values для заданного id - имейте в виду, что вы можете: a) создать функцию, специфичную для этого набора таблиц/столбцов, или б) создать (более) общий UDF, но тогда вызов функции основного запроса может быть немного более запутанным (см. универсальная пользовательская функция)   -  person markp-fuso    schedule 21.06.2018


Ответы (1)


Вы можете сделать это с помощью row_number(), который должен быть доступен в вашей версии Sybase:

select id,
       stuff((max(case when seqnum = 1 then '|' + value else '' end) +
              max(case when seqnum = 2 then '|' + value else '' end) +
              max(case when seqnum = 3 then '|' + value else '' end) +
              max(case when seqnum = 4 then '|' + value else '' end)
             ), 1, 1, '') as vals
from (select t.*, row_number() over (partition by id order by value) as seqnum
      from t
     ) t
group by id;
person Gordon Linoff    schedule 22.06.2018
comment
ни row_number(), ни over(partition by) не работают в sybase ASE. - person vijay; 25.06.2018