group_concat в Informix - PullRequest
       33

group_concat в Informix

2 голосов
/ 28 января 2009

Поиск запроса в SQL Informix, который будет имитировать функцию group_concat MySQL.

MySQL group_concat создает перечисление всех членов группы.

То есть со следующими данными:

orderid:itemName:price
      1:Paper   :10
      1:Pen     :5
      2:Sugar   :15

и следующий запрос:

select group_concat(itemName), sum(price)
from order_details
group by orderid

будет производить:

items    :price
Paper,Pen:15
Sugar    :15

Какой самый эффективный способ добиться этого в Informix? Обязательно ли нам использовать хранимую процедуру?

Ответы [ 2 ]

3 голосов
/ 29 января 2009

Для этого вам нужно определить пользовательский агрегат. Он состоит из четырех частей - четырех функций (для поиска CREATE AGGREGATE в информационном центре IDS 12.10 ):

  1. Инициализатор (INIT)
  2. Итератор (ИТЭР)
  3. комбайн (КОМБИНАТ)
  4. Финализатор (ФИНАЛ)

Это официальная терминология в столицах, и она в меру интуитивно понятна. Подумайте о расчете среднего.

  1. Инициализатор: установить сумму = 0; N = 0
  2. Итератор: установить сумму + = x; N ++
  3. Combiner: установить сумму = сумма1 + сумма2; установить N = N1 + N2
  4. Финализатор: результат = сумма / N - с N = 0 (деление на ноль) проверок

Объединитель используется для объединения промежуточных результатов параллельного выполнения; каждое параллельное выполнение начинается с итератора и генерирует промежуточные результаты. Когда параллельное выполнение завершается, отдельные наборы значений объединяются с объединителем.

Вы можете написать аналогичный код в IDS - используя хранимые процедуры или UDR на C или Java.

См. Вопрос SO Показать отношение один ко многим в виде 2 столбцов - 1 уникальная строка (список, разделенный ID и запятыми) для функции GROUP_CONCAT () на основе строк, реализованной в Informix.

1 голос
/ 29 января 2009

Конечно, в Informix нет встроенной функции для этого. Есть ли в других основных СУБД такая странная агрегатная функция? Упорядочивание по столбцу, не выбранному в запросе, немного сомнительно, но группировка? Это новый для меня.

Вам потребуется написать хранимую процедуру или UDR для генерации такого набора данных. Если честно, я бы не попытался сделать это в базе данных. Похоже, задача лучше всего подходит для потребителя этого вывода (например, приложение / webapp / report-writer и т. Д.)

...