Pregunta
Buscando una consulta en SQL de Informix que simule la función group_concat
de MySQL.
Lo que hace MySQL <=> es crear una enumeración de todos los miembros del grupo.
Entonces con los datos de la siguiente manera:
orderid:itemName:price
1:Paper :10
1:Pen :5
2:Sugar :15
y la siguiente consulta:
select group_concat(itemName), sum(price)
from order_details
group by orderid
produciría:
items :price
Paper,Pen:15
Sugar :15
¿Cuál sería la forma más eficiente de lograr esto en Informix? ¿Definitivamente tendríamos que usar un procedimiento almacenado?
Solución
Tendría que definir un agregado definido por el usuario para hacer esto. Tiene cuatro partes: cuatro funciones (busque CREAR AGREGADO en el IDS 12.10 Centro de información ):
- Inicializador (INIT)
- Iterador (ITER)
- Combinar (COMBINAR)
- Finalizador (FINAL)
Esa es la terminología oficial en mayúsculas, y es moderadamente intuitiva. Piense en calcular un promedio.
- Inicializador: set sum = 0; N = 0
- Iterador: set sum + = x; N ++
- Combinador: set sum = sum1 + sum2; establecer N = N1 + N2
- Finalizador: resultado = suma / N - con N = 0 (división cero) verificaciones
El combinador se usa para combinar resultados intermedios de ejecución paralela; cada ejecución paralela comienza con el iterador y genera resultados intermedios. Cuando se completa la ejecución paralela, los conjuntos de valores separados se combinan con el combinador.
Puede escribir código análogo en IDS, utilizando procedimientos almacenados o UDR C o Java.
Vea la pregunta SO Muestra una relación de uno a muchos como 2 columnas & # 8212; 1 fila única (ID & Amp; lista separada por comas) para una función GROUP_CONCAT () basada en cadenas implementada en Informix.
Otros consejos
Ciertamente no hay una función incorporada en Informix para hacer esto. ¿Algún otro RDBMS convencional tiene una función agregada tan extraña? Ordenar por una columna no seleccionada en una consulta es un poco dudoso, pero ¿agrupar? Esa es una nueva para mí.
Tendría que escribir un procedimiento almacenado o UDR para generar dicho conjunto de datos. Para ser honesto, no intentaría esto en la base de datos. Parece una tarea más adecuada para el consumidor de esta salida (es decir, la aplicación / webapp / report-writer, etc.).