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?

¿Fue útil?

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 ):

  1. Inicializador (INIT)
  2. Iterador (ITER)
  3. Combinar (COMBINAR)
  4. Finalizador (FINAL)

Esa es la terminología oficial en mayúsculas, y es moderadamente intuitiva. Piense en calcular un promedio.

  1. Inicializador: set sum = 0; N = 0
  2. Iterador: set sum + = x; N ++
  3. Combinador: set sum = sum1 + sum2; establecer N = N1 + N2
  4. 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.).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top