Comment peut-plusieurs lignes concaténer en un seul Oracle sans créer une procédure stockée? [dupliquer]
-
21-08-2019 - |
Question
Cette question a déjà une réponse ici:
Comment puis-je obtenir les résultats suivants dans l'oracle sans créer une procédure stockée?
Set de données:
question_id element_id
1 7
1 8
2 9
3 10
3 11
3 12
Résultat souhaité:
question_id element_id
1 7,8
2 9
3 10,11,12
La solution
Il y a plusieurs façons de faire l'agrégation de chaîne, mais le plus simple est une fonction définie par l'utilisateur. Essayez ceci pour une manière qui ne nécessite pas une fonction. Comme note , il n'y a pas de manière simple sans la fonction.
Ceci est le plus court chemin sans une fonction personnalisée: (il utilise le ROW_NUMBER () et les fonctions de SYS_CONNECT_BY_PATH)
SELECT questionid,
LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements
FROM (SELECT questionid,
elementid,
ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr,
ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) -1 AS prev
FROM emp)
GROUP BY questionid
CONNECT BY prev = PRIOR curr AND questionid = PRIOR questionid
START WITH curr = 1;
Autres conseils
De Oracle 11gR2, LISTAGG l'article devrait faire l'affaire:
SELECT question_id,
LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
Attention si la chaîne résultante est trop grand (plus de 4000 caractères pour un VARCHAR2, par exemple): la version 12cR2, nous pouvons utiliser TRUNCATE DEBORDEMENT ON / eRREUR pour faire face à ce problème.
Facile:
SELECT question_id, wm_concat(element_id) as elements
FROM questions
GROUP BY question_id;
pesonally testé sur 10g; -)
De http://www.oracle-base.com/articles/10g /StringAggregationTechniques.php
Ce OTN-fil contient plusieurs façons de faire l'agrégation de chaînes, y compris une comparaison de la performance: http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487