Вопрос
Ищу запрос в Informix's SQL, который будет имитировать MySQL's group_concat
функция.
Что такое 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?Обязательно ли нам было бы использовать хранимую процедуру?
Решение
Для этого вам нужно было бы определить определяемый пользователем агрегат.Который состоит из четырех частей - четырех функций (поиск СОЗДАТЬ АГРЕГАТ в IDS 12.10 Информационный центр):
- Инициализатор (INIT)
- Итератор (ITER)
- Комбайн (COMBINE)
- Финализатор (FINAL)
Это официальная терминология, написанная заглавными буквами, и она в меру интуитивно понятна.Подумайте о вычислении среднего значения.
- Инициализатор:установленная сумма = 0;N = 0
- Итератор:установленная сумма += x;N++
- Объединитель:установленная сумма = сумма1 + сум2;установите N = N1 + N2
- Завершитель:результат = сумма / N - с проверками N= 0 (деление на ноль)
Объединитель используется для объединения промежуточных результатов параллельного выполнения;каждое параллельное выполнение начинается с итератора и генерирует промежуточные результаты.Когда параллельное выполнение завершается, отдельные наборы значений объединяются с помощью объединителя.
Вы можете написать аналогичный код в IDS - используя хранимые процедуры или C или Java UDR.
Смотрите вопрос SO Показать отношение "один ко многим" в виде 2 столбцов — 1 уникальной строки (список идентификаторов и разделенных запятыми) для функции GROUP_CONCAT() на основе строк, реализованной в Informix.
Другие советы
Конечно, в Informix нет встроенной функции для этого.Есть ли у какой-либо другой основной СУБД такая причудливая агрегатная функция?Упорядочение по столбцу, не выбранному в запросе, немного сомнительно, но группировка?Это что-то новенькое для меня.
Вам пришлось бы написать хранимую процедуру или UDR, чтобы сгенерировать такой набор данных.Честно говоря, я бы не стал пытаться сделать это в базе данных.Это похоже на задачу, лучше всего подходящую для потребителя этого вывода (т. Е. приложения / веб-приложения / составителя отчетов и т.д.).