2009-01-28 18 views
2

Vous recherchez une requête dans SQL d'Informix qui simulera la fonction group_concat de MySQL.group_concat dans Informix

Ce que fait group_concat de MySQL est qu'il crée une énumération de tous les membres du groupe.

Donc, avec les données suivantes:

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

et la requête suivante:

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

produirait:

items :price 
Paper,Pen:15 
Sugar :15 

Quelle serait la plus efficace pour atteindre cet objectif en Informix? Serions-nous obligés d'utiliser une procédure stockée?

Répondre

3

Vous devez définir un agrégat défini par l'utilisateur pour ce faire. Cela comporte quatre parties - quatre fonctions (recherche CREATE AGGREGATE dans le IDS 12.10 Info Centre):

  1. Initializer (INIT)
  2. iterator (ITER)
  3. Combiner (Combine)
  4. Finalizer (FINAL)

C'est la terminologie officielle en majuscules, et elle est modérément intuitive. Pensez à calculer une moyenne.

  1. Initialisateur: set somme = 0; N = 0
  2. Iterateur: somme d'ensemble + = x; N
  3. Combinateur: set somme = somme1 + somme2; régler N = N1 + N2
  4. Finalizer: result = somme/N - avec N = 0 (zéro-fracture) vérifie

Le combineur est utilisé pour combiner les résultats intermédiaires de l'exécution en parallèle; chaque exécution parallèle commence avec l'itérateur et génère des résultats intermédiaires. Lorsque l'exécution en parallèle est terminée, les ensembles de valeurs distincts sont combinés avec le combineur.

Vous pouvez écrire du code analogue dans IDS en utilisant des procédures stockées ou des UDR C ou Java.

Voir la question SO Show a one to many relationship as 2 columns — 1 unique row (ID & comma separated list) pour une fonction GROUP_CONCAT() basée sur une chaîne implémentée dans Informix.

1

Il n'y a certainement pas de fonction intégrée dans Informix pour cela. Est-ce que d'autres RDBMS traditionnels ont une fonction d'agrégat aussi bizarre? La commande par une colonne non sélectionnée dans une requête est un peu douteuse, mais le regroupement? C'est nouveau pour moi.

Vous devez écrire une procédure stockée ou UDR pour générer un tel ensemble de données. Pour être honnête, je ne tenterais pas cela dans la base de données. Cela ressemble à une tâche mieux adaptée au consommateur de cette sortie (c'est-à-dire l'application/webapp/report-writer etc).

+0

Je comprends qu'Informix ne dispose pas d'une fonction intégrée qui le fait, je cherche une requête qui peut simuler ce comportement. A partir de maintenant, j'ai une procédure stockée qui fournit cette information. En fait, je ne trouve pas la fonction bizarre, AFAIK SQL standard ne mentionne pas que seules les fonctions d'agrégat mathématiques doivent être appliquées sur les groupes. Cependant, je ne connais aucun autre SGBDR qui supporte une telle fonction intégrée. – calvinkrishy

Questions connexes