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 11/09/2008, 09h53   #1
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
Par défaut Requête SQL sous 8i - Comment faire SVP ?

Bonjour à tous et par avance merci !
Voilà, j'ai un problème avec une requête dont je n'arrive pas à me dépatouiller. Je compte sur vous !

Il s'agit pourtant d'une seule table avec deux champs (pour faire simple). Ça a l'air simple effectivement mais je me complique la vie avec trois calculs en projections et plusieurs conditions.

Illustration ci-après avec la table et le résultat voulu, puis enfin les conditions : (j'espère que ça va le faire graphiquement)...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
La TABLE LAMBDA et ses deux champs :
CONSULTATION ETAT
------------ -----
08/01        N
08/01        E
08/01        E
08/02        I
08/03        N
08/03        S
08/04        E
08/05        E
08/05        I
08/06        E
08/06        N
08/06        S
Illustration du résultat de la requête désirée :
Code :
1
2
3
4
5
6
7
8
CONSULTATION | NOMBRE DE | NOMBRE DE  | NOMBRE DE
             |     E     |    N       |  S ou I
------------  --------    --------     --------
08/01           2              1
08/04           1
08/05           1              1           1
08/06           1              1           1
Voici pour les projections, maintenant les conditions :
Seuls les "E" m'intéressent, quand j'en trouve je les compte. Mais quand j'en trouve, je dois aussi chercher si j'ai des "N" pour les compter aussi, puis chercher si j'ai éventuellement des "I" ou des "S" à additionner encore !
Eh ben je séche ! Ma difficulté est double, un pas évident d'avoir plusieurs calculs en projection, deux avec ces conditions je n'arrive pas à savoir si je dois le faire en PL/SQL... Mais de toute façon ça ne m'avance pas plus !

Est-ce que ça vous cause ? En tout cas, j'espère que ça vous tente !
Encore merci !
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 09h58   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Un truc de ce genre :

Code :
1
2
3
4
SELECT CONSULTATION , SUM(DECODE(Etat,'E',1,0)), SUM(DECODE(Etat,'N',1,0)), SUM(DECODE(Etat,'I',1,'S',1,0))
FROM TABLE
HAVING SUM(DECODE(Etat,'E',1,0)) > 0
GROUP BY consultation
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 10h02   #3
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
Dis moi pas qu'c'est pas vrai ?
Si court et si rapide ?
Serais-je donc si nul ?
Je cours tester ça tout de suite !!!!!!!
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2008, 15h03   #4
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
Super, génial, merci orafrance !!!
Ça fonctionne parfaitement ! Je n'avais jamais employé ce DECODE auparavant.
Seulement voilà, c'est contraint et contrit que je me vois obligé de revenir vers vous car je n'arrive pas à l'intégrer à ma requête ...
J'espère ne pas trop vous bassiner avec mes histoires mais j'ai un gros problème de « savoir faire » apparemment, or je dois y parvenir absolument... bref ! Puis-je abuser ?
Par avance merci !

Je reprends :
Le copier/coller de votre réponse appliqué à mon exemple concret donne ceci et fonctionne à merveille :
Code :
1
2
3
4
5
6
7
SELECT lot.conccp AS "CONSULTATION", 
sum(decode(lot.etlid,'E',1,0)) AS "NOMBRE DE LOTS E",
sum(decode(lot.etlid,'N',1,0)) AS "NOMBRE DE LOTS N",
sum(decode(lot.etlid,'S',1,'I',1,0)) AS "NOMBRE DE LOTS S OU I"
FROM lot
GROUP BY lot.conccp
HAVING sum(decode(lot.etlid,'E',1,0))>0;
Voici la requête initiale qui se bornait à compter le nombre de lots pour chaque consultation (avant qu'on me demande de différencier par type de lots).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT DISTINCT 
(SELECT gpuid FROM usr_gpu WHERE consultation.usradm=usrid) AS "BUREAU",
(SELECT substr(usrnom,1,10) FROM utilisateur 
 WHERE usrid=consultation.usradm) AS "REDACTEUR",
(SELECT substr(usrnom,1,10) FROM utilisateur 
 WHERE usrid=consultation.usrautcreat) AS "AUTEUR",
consultation.conccp AS "N° CONSULTATION",
(SELECT actclair FROM activite WHERE actid=programme.actid) AS "ACTIVITE",
consultation.conclair AS "OBJET CONSULTATION",
(SELECT dummy FROM dual) AS "BENEFICIAIRE",
(SELECT prcclair||' ('||prcdesc||' )' FROM procedure 
 WHERE prcid=consultation.prcid) AS "TYPE PROCEDURE",
echeancier.echdnotif AS "DATE NOTIF",
consultation.conddepot AS "DLRO",
(SELECT count(lotid) FROM lot WHERE etlid IN ('E') 
 AND conccp=consultation.conccp GROUP BY lot.conccp) AS "NBRE LOTS"
FROM consultation,programme,echeancier,or_con
WHERE programme.prgregrpt=consultation.conccp AND
echeancier.echnum=or_con.echnum AND or_con.conccp=consultation.conccp;
En gros je trouve mes consultations dans la table CONSULTATION et les lots des consultations dans la table LOT. Tout le reste n'est là que pour remplir un tableau d'une douzaine de colonnes. La dernière colonne doit être scindée en trois mais je ne parviens pas à intégrer votre solution. J'ai plein de problèmes de GROUP BY dûs à mes select de select dans les projections et aussi au trop grand nombre de colonnes exigées... Et je ne m'en sors pas !

C'est vraiment galère pour moi.
Une nouvelle fois merci...
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2008, 15h43   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
essaye :
Code :
1
2
3
4
5
6
        (
         SELECT SUM(DECODE(etlid,'E',1,0)), SUM(DECODE(etlid,'N',1,0)), SUM(DECODE(etlid,'I',1,'S',1,0))
          FROM lot
		 WHERE conccp = consultation.conccp
        HAVING SUM(DECODE(etlid,'E',1,0)) > 0
        ) AS "NBRE LOTS"
Sinon, pourquoi tu ne fais pas :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
SELECT DISTINCT
        usr_gpu.gpuid AS "BUREAU",
        (
                SELECT  SUBSTR(usrnom,1,10)
                FROM    utilisateur
                WHERE   usrid=consultation.usradm
        ) AS "REDACTEUR",
        (
                SELECT  SUBSTR(usrnom,1,10)
                FROM    utilisateur
                WHERE   usrid=consultation.usrautcreat
        )                   AS "AUTEUR"         ,
        consultation.conccp AS "N° CONSULTATION",
        activite.actclair AS "ACTIVITE"          ,
        consultation.conclair AS "OBJET CONSULTATION",
        '' AS "BENEFICIAIRE",
        prcclair ||' (' || prcdesc ||' )' AS "TYPE PROCEDURE",
        echeancier.echdnotif   AS "DATE NOTIF"    ,
        consultation.conddepot AS "DLRO"          ,
        (
         SELECT SUM(DECODE(etlid,'E',1,0)), SUM(DECODE(etlid,'N',1,0)), SUM(DECODE(etlid,'I',1,'S',1,0))
          FROM lot
		 WHERE conccp = consultation.conccp
        HAVING SUM(DECODE(etlid,'E',1,0)) > 0
        ) AS "NBRE LOTS"
FROM    consultation,
        programme   ,
        echeancier  ,
        or_con      ,
		usr_gpu     ,
		activite    ,
		procedure   ,
WHERE   programme.prgregrpt=consultation.conccp
    AND echeancier.echnum  =or_con.echnum
    AND or_con.conccp      =consultation.conccp
	AND consultation.usradm=usr_gpu.usrid
	AND activite.actid=programme.actid
	AND procedure.prcid=consultation.prcid
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2008, 16h48   #6
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
Merci encore pour tous ces efforts mais Oracle me retourne l'erreur ORA-00913 Trop de valeurs pour la fameuse modif si judicieuse... On chauffe, on chauffe !
Il faut que je gratte. On m'a parlé aussi des jointures externes à la (+)...
Citation:
... jointure externe permet de contrer l'hypothèse du monde clos en considérant qu'en cas d'absence de jointure entre une table et l'autre, on ne supprime par pour autant l'information.
... en éliminant les select imbriqués.
Mais est-ce la solution et est-ce que ça fonctionne bien en 8i ?
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 13h14   #7
Futur Membre du Club
 
Inscription : septembre 2004
Messages : 28
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 28
Points : 17
Points : 17
ÇA Y EST !
Mais que ce fut dur !!
Un GRAND MERCI à orafrance pour son aide précieuse et son abnégation

D'apparence compliquée de prime abord, l'astucieux DECODE, un FROM (select distinct...), puis un regroupement classique en sont finalement venus à bout ! Pfouh... je reviens de loin...

Présentation du code final :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
SELECT DISTINCT gpuid||'#'||
substr(u1.usrnom,1,10)||'#'||
substr(u2.usrnom,1,10)||'#'||
consultation.conccp||'#'||
actclair||'#'||
consultation.conclair||'#'||
''||'#'||
prcclair||' ('||prcdesc||' )'||'#'||
echdnotif||'#'||
conddepot||'#'||
SUM(DECODE(etlid,'E',1,0))||'#'||
SUM(DECODE(etlid,'N',1,0))||'#'||
SUM(DECODE(etlid,'S',1,'I',1,0))
FROM  	consultation,
	activite,
	lot,usr_gpu,
	utilisateur u1,
	utilisateur u2,
	procedure,
(SELECT DISTINCT o.conccp,e.echnum,echdnotif,actid 
FROM or_con o,echeancier e,consultation c,programme p
 WHERE o.echnum=e.echnum AND c.conccp=o.conccp AND p.prgregrpt=c.conccp) y
WHERE	consultation.usradm=usr_gpu.usrid AND
	consultation.usradm=u1.usrid AND
	consultation.usrautcreat=u2.usrid AND
	consultation.prcid=procedure.prcid AND
	activite.actid=y.actid AND
	y.conccp=consultation.conccp AND
	lot.conccp= consultation.conccp
GROUP BY 	gpuid,
		u1.usrnom,
		u2.usrnom,
		consultation.conclair,
		actclair,
		conddepot,
		prcclair,
		prcdesc,
		consultation.conccp,
		echdnotif,
		conddepot
HAVING SUM(DECODE(lot.etlid,'E',1,0)) > 0
Pas très disert sur ce forum, je reviendrai c'est promis !
akr54 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2008, 13h44   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Félicitations
orafrance 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 05h38.


 
 
 
 
Partenaires

Hébergement Web