Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2011, 09h20   #1
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 56
Points : 32
Points : 32
Par défaut Ordre d'aggrégation des chaînes

Bonjour,

J'ai un problème d'ordre lorsque je fais de l'aggrégation de valeurs.
Voici un exemple de données :

Code :
1
2
3
4
5
SELECT 'USER1000' Usr,2 Grp, 'Info 2' Info, '30/08/2011 12:13:11' DateHeure, 'U-0013' Nom, 'A' Code FROM dual union ALL
SELECT 'USER0002',NULL,NULL,NULL,NULL,NULL FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:07', 'U-1703', 'A' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:23', 'U-1902', 'B' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:22:10', 'U-2026', 'A' FROM dual
USER1000 2 Info 2 30/08/2011 12:13:11 U-0013 A
USER0002
USER1111 1 Info 1 30/08/2011 12:20:07 U-1703 A
USER1111 1 Info 1 30/08/2011 12:20:23 U-1902 B
USER1111 1 Info 1 30/08/2011 12:22:10 U-2026 A

Je souhaite grouper les valeurs suivant USR, GRP et INFO et concaténer les NOM et concaténer les CODE

voici un exemple de requête pour grouper et concaténer les valeurs :
Code :
1
2
3
4
5
6
7
8
9
10
11
WITH q AS (
SELECT 'USER1000' Usr,2 Grp, 'Info 2' Info, '30/08/2011 12:13:11' DateHeure, 'U-0013' Nom, 'A' Code FROM dual union ALL
SELECT 'USER0002',NULL,NULL,NULL,NULL,NULL FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:07', 'U-1703', 'A' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:23', 'U-1902', 'B' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:22:10', 'U-2026', 'A' FROM dual)
SELECT USR, GRP, INFO, min(DATEHEURE) DATE_MIN,
       wm_concat(NOM) NOMS,
       wm_concat(CODE) CODES
 FROM q
GROUP BY USR, GRP, INFO
Et en résultat j'obtiens :

USER0002
USER1000 2 Info 2 30/08/2011 12:13:11 U-0013 A
USER1111 1 Info 1 30/08/2011 12:20:07 U-1703,U-2026,U-1902 A,B,A

Le problème c'est que pour le USER1111, je veux les noms dans l'ordre et les codes associés dans l'ordre : U-1703,U-1902,U-2026 et en code : A,B,A, car les 2 infos sont liées et il faut qu'elles soient dans le même ordre, dans l'ordre de la DateHeure.

Je suis sous Oracle 10.2.0.4.0, et j'ai essayé sous Oracle 11.2.0.1.0 et l'ordre de concaténation change entre les versions.
J'ai essayé de mettre un order by :
Code :
1
2
3
4
5
6
7
8
9
10
11
WITH q AS (
SELECT 'USER1000' Usr,2 Grp, 'Info 2' Info, '30/08/2011 12:13:11' DateHeure, 'U-0013' Nom, 'A' Code FROM dual union ALL
SELECT 'USER0002',NULL,NULL,NULL,NULL,NULL FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:07', 'U-1703', 'A' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:23', 'U-1902', 'B' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:22:10', 'U-2026', 'A' FROM dual)
SELECT USR, GRP, INFO, min(DATEHEURE) DATE_MIN,
       wm_concat(NOM) NOMS,
       wm_concat(CODE) CODES
FROM (SELECT * FROM q ORDER BY USR, GRP, INFO, DATEHEURE)
GROUP BY USR, GRP, INFO
Mais ça ne change rien.

Comment faire ?

Merci
Zugg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 10h06   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
wm_concat/stragg ne trie pas.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
WITH q AS (
SELECT 'USER1000' Usr,2 Grp, 'Info 2' Info, '30/08/2011 12:13:11' DateHeure, 'U-0013' Nom, 'A' Code FROM dual union ALL
SELECT 'USER0002',NULL,NULL,NULL,NULL,NULL FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:07', 'U-1703', 'A' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:23', 'U-1902', 'B' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:22:10', 'U-2026', 'A' FROM dual)
SELECT USR, GRP, INFO, min(DATEHEURE) DATE_MIN,
       cast(collect(NOM ORDER BY dateheure)  AS varchar2_tt) NOMS,
       cast(collect(CODE  ORDER BY dateheure)  AS varchar2_tt) CODES
FROM (SELECT * FROM q ORDER BY USR, GRP, INFO, DATEHEURE)
GROUP BY USR, GRP, INFO
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 10h35   #3
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 56
Points : 32
Points : 32
Oui l'aggrégation ne trie pas en effet, d'où mon problème.

La solution proposée, suppose la création du type :
Code :
CREATE type varchar2_tt AS TABLE of VARCHAR2(100);
Mais au final, j'obtiens pas mes éléments sous forme d'une chaine, comment faire ?
Zugg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 14h47   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Vous pouvez trouver une réponse dans "the collect function in 10g"
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 17h27   #5
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 56
Points : 32
Points : 32
merci mnitu, tout est bien expliqué dans ton lien.

Sinon, après avoir tourné la requête dans tous les sens j'ai une autre solution qui ne nécessite aucun type ni fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH q AS (
SELECT 'USER1000' Usr,2 Grp, 'Info 2' Info, '30/08/2011 12:13:11' DateHeure, 'U-0013' Nom, 'A' Code FROM dual union ALL
SELECT 'USER0002',NULL,NULL,NULL,NULL,NULL FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:07', 'U-1703', 'A' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:20:23', 'U-1902', 'B' FROM dual union ALL
SELECT 'USER1111',1, 'Info 1', '30/08/2011 12:22:10', 'U-2026', 'A' FROM dual)
SELECT USR, GRP, INFO, min(DATEHEURE) DATE_MIN,
       max(NOMS) NOMS,
       max(CODES) CODES
FROM (
SELECT  USR, GRP, INFO, DATEHEURE, 
       wm_concat(NOM) over (partition BY USR, GRP ORDER BY USR, GRP, DATEHEURE) NOMS,
       wm_concat(CODE) over (partition BY USR, GRP ORDER BY USR, GRP, DATEHEURE) CODES
       FROM q )
GROUP BY USR, GRP, INFO
à priori ça donne bien le résultat voulu.
merci
Zugg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 14h50   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Très bien. Sur le même site: listagg function in 11g release 2
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 13h02   #7
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 56
Points : 32
Points : 32
oui en effet.

Le problème c'est que je dois être compatible minimum Oracle 10gR2.

En tout cas merci pour le lien, je vais le garder de côté.
Zugg est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h33.


 
 
 
 
Partenaires

Hébergement Web