Mettre tous les résultats sur une même ligne

Résolu/Fermé
JsuisNul Messages postés 122 Date d'inscription mercredi 13 février 2013 Statut Membre Dernière intervention 14 février 2024 - Modifié le 22 janv. 2020 à 11:55
JsuisNul Messages postés 122 Date d'inscription mercredi 13 février 2013 Statut Membre Dernière intervention 14 février 2024 - 22 janv. 2020 à 18:01
Bonjour,

J'ai une requête sql ou je vais chercher à chaque fois 1 occurrence sur chaque information extraite sauf pour une information ou je dois extraire deux occurrences pour un même dossier.
J'ai utilisé des case en pensant que cela me permettrait d'obtenir mes résultats sur une seule ligne.
Finalement j'obtiens ceux-ci :

AAAA;BBBB;CCCC;null;EEEE
AAAA;BBBB;null;DDDD;EEEE

Avec CCCC et DDDD issue de la même information.
Est-ce que quelqu'un sait comment je peux faire pour avoir
AAAA;BBBB;CCCC;DDDD;EEEE

Ci-joint ma requête :

Select a.cdcode , b.liblon, c.cdsire, c.cdsire||c.cdnics ,f.zonadb as voie, substr(f.zonadd,6,39)as Ville, f.cdpost, substr(f.zonadc,1,5) as INSEE,f.cdpays,
case when x.typtel = 'EML' then x.numtel end AS contact,
case when x.typtel in ('PPP','HPN') then x.numtel else '' end AS Telcontact,
case when d.nateta = '1' then 'Etablissement Siége' else '' end AS NatEtab,
case when d.nateta = '1' then c.cdnics else '' end AS Nic,
case when s.opt006 = '1' then 'AmAlsaceMoselle' else '' end AS AmAlsaceMoselle 
from  zd01 b, zdag c, zd7r d, zd39 e,zd0f f,  zd00 a
left join zdf1 s on a.nudoss = s.nudoss 
left join zd0h x on a.nudoss = x.nudoss
where  a.cdstco='DRE' and e.idcy00 in ('598','584','581','578','574','567','549','547','546','531','530','529','526','523','522','519','515','502','500')
and a.nudoss=b.nudoss and a.nudoss=c.nudoss and a.nudoss=f.nudoss 
and a.nudoss=d.nudoss
and a.nudoss = e.nudoss
order by a.cdcode


Merci d'avance

Configuration: Windows / Chrome 79.0.3945.117

4 réponses

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
22 janv. 2020 à 12:10
Bonjour,
ce que tu veux faire ressemble à un GROUP_CONCAT sous mysql.

Regarde la réponse donnée ici
https://stackoverflow.com/questions/16771086/is-there-any-function-in-oracle-similar-to-group-concat-in-mysql


0
JsuisNul Messages postés 122 Date d'inscription mercredi 13 février 2013 Statut Membre Dernière intervention 14 février 2024 1
22 janv. 2020 à 14:27
J'avais vu cette fonction mais je n'ai pas réussi à la faire fonctionner.
Je vais retenter.

Merci.
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
22 janv. 2020 à 15:02
Quelle version d'Oracle utilises tu ?
0
JsuisNul Messages postés 122 Date d'inscription mercredi 13 février 2013 Statut Membre Dernière intervention 14 février 2024 1
22 janv. 2020 à 17:06
je viens justement de re-tester et la commande n'est as reconnu...En plus avec cette fonction je n'ai pas le choix sur l'ordre d'affichage des infos...

Voila les infos que j'ai pu trouvé sur a version oracle :

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
22 janv. 2020 à 17:31
De quelle fonction parles tu ?
Si c'est bien :
https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions089.htm#SQLRF30030

Il est bien indiqué qu'elle est compatible Oracle 11G ..; et si tu lis la doc.. qu'elle met l'ordre utilisé dans le ORDER BY de ta requête....
0
JsuisNul Messages postés 122 Date d'inscription mercredi 13 février 2013 Statut Membre Dernière intervention 14 février 2024 1
22 janv. 2020 à 18:01
je parlais de la Group_Concat :

ORA-00904: "GROUP_CONCAT" : identificateur non valide
00904. 00000 - "%s: invalid identifier"

J'ai trouvé une solution en utilisant un group by et en mettant la fonction min devant mes case et ça fonctionne :

Select a.cdcode , b.liblon, c.cdsire, c.cdsire||c.cdnics ,f.zonadb as voie, substr(f.zonadd,6,39)as Ville, f.cdpost, substr(f.zonadc,1,5) as INSEE,f.cdpays,
case when d.nateta = '1' then 'Etablissement Siége' else '' end AS NatEtab,
case when d.nateta = '1' then c.cdnics else '' end AS Nic,
case when s.opt006 = '1' then 'AmAlsaceMoselle' else '' end AS AmAlsaceMoselle,
min(case when x.typtel = 'EML' then x.numtel else '' end) AS contact,
min(case when x.typtel in ('PPP','HPN') then x.numtel else '' end) AS Telcontact
from zd01 b, zdag c, zd7r d, zd39 e,zd0f f, zd00 a
left join zdf1 s on a.nudoss = s.nudoss
left join zd0h x on a.nudoss = x.nudoss
where a.cdstco='DRE' and e.idcy00 in ('598','584','581','578','574','567','549','547','546','531','530','529','526','523','522','519','515','502','500')
and a.nudoss=b.nudoss and a.nudoss=c.nudoss and a.nudoss=f.nudoss
--and a.nudoss=s.nudoss
and a.nudoss=d.nudoss
and a.nudoss = e.nudoss
group by a.cdcode , b.liblon, c.cdsire, c.cdsire||c.cdnics ,f.zonadb, substr(f.zonadd,6,39), f.cdpost, substr(f.zonadc,1,5),f.cdpays,
case when d.nateta = '1' then 'Etablissement Siége' else '' end,
case when d.nateta = '1' then c.cdnics else '' end,
case when s.opt006 = '1' then 'AmAlsaceMoselle' else '' end
order by a.cdcode

Merci à toi !!
0