Domanda

Alla ricerca di una query nel codice SQL di Informix che simuli la funzione group_concat di MySQL.

Quello che fa MySQL <=> crea un elenco di tutti i membri del gruppo.

Quindi con i dati come segue:

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

e la seguente query:

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

produrrebbe:

items    :price
Paper,Pen:15
Sugar    :15

Quale sarebbe il modo più efficace per raggiungere questo obiettivo in Informix? Dovremmo sicuramente usare una procedura memorizzata?

È stato utile?

Soluzione

Dovresti definire un aggregato definito dall'utente per farlo. Questo ha quattro parti: quattro funzioni (cerca CREATE AGGREGATE in Centro informazioni IDS 12.10 ):

  1. Inizializzatore (INIT)
  2. Iteratore (ITER)
  3. Combina (COMBINA)
  4. Finalizzatore (FINAL)

Questa è la terminologia ufficiale in maiuscolo ed è moderatamente intuitiva. Pensa a calcolare una media.

  1. Inizializzatore: set sum = 0; N = 0
  2. Iteratore: set sum + = x; N ++
  3. Combinatore: set sum = sum1 + sum2; impostare N = N1 + N2
  4. Finalizzatore: risultato = somma / N - con controlli N = 0 (divisione zero)

Il combinatore viene utilizzato per combinare risultati intermedi da un'esecuzione parallela; ogni esecuzione parallela inizia con l'iteratore e genera risultati intermedi. Al termine dell'esecuzione parallela, i set di valori separati vengono combinati con il combinatore.

È possibile scrivere un codice analogo in IDS - usando stored procedure o UDR C o Java.

Vedi la domanda SO Mostra una o più relazioni come 2 colonne & # 8212; 1 riga univoca (ID & Amp; elenco separato da virgole) per una funzione GROUP_CONCAT () basata su stringhe implementata in Informix.

Altri suggerimenti

Non c'è certamente alcuna funzione integrata in Informix per farlo. Qualche altro RDBMS tradizionale ha una funzione aggregata così bizzarra? Ordinare per una colonna non selezionata in una query è un po 'dubbio, ma raggruppare? È una novità per me.

Dovresti scrivere una stored procedure o UDR per generare un set di dati di questo tipo. Ad essere sincero, non tenterei questo nel database. Sembra un'attività più adatta al consumatore di questo output (ad esempio l'applicazione / webapp / autore di report, ecc.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top